From da34aa087eb0e19f5a687bdd291e963605480965 Mon Sep 17 00:00:00 2001 From: Andreas Schaeffer Date: Sat, 26 Apr 2025 03:15:46 +0200 Subject: [PATCH 1/6] Refactored into new mono repo reactive-graph/sys --- .cargo/config.toml | 9 + .deployment.toml | 3 + .gitattributes | 2 + .github/FUNDING.yml | 1 + .github/auto_assign.yml | 6 + .github/dependabot.yml | 32 + .github/labeler.yml | 80 + .github/workflows/add_labels.yml | 15 + .github/workflows/audit.yml | 31 + .github/workflows/book.yml | 69 + .github/workflows/coverage.yml | 52 + .github/workflows/docs.yml | 63 + .github/workflows/mark-stale-prs.yml | 27 + .github/workflows/msrv.yml | 45 + .github/workflows/pr-auto-assign.yml | 18 + .github/workflows/pr-labeler.yml | 14 + .github/workflows/release.yml | 255 + .github/workflows/remove_labels.yml | 16 + .github/workflows/rust.yml | 166 + .github/workflows/wip.yml | 15 + .gitignore | 31 +- .run/Audit.run.xml | 21 + .run/Build Nightly.run.xml | 22 + .run/Build Release aarch64.run.xml | 17 + .run/Build Release armv7.run.xml | 17 + .run/Build Release.run.xml | 22 + .run/Build.run.xml | 22 + .run/Bundle Deb aarch64.run.xml | 21 + .run/Bundle Deb armv7.run.xml | 21 + .run/Bundle Deb x86_64.run.xml | 21 + .run/Check Formatting.run.xml | 21 + .run/Clean.run.xml | 21 + .run/Clippy.run.xml | 21 + .run/Docs.run.xml | 22 + .run/Outdated.run.xml | 21 + .run/Tarpaulin.run.xml | 19 + .run/Test Nightly.run.xml | 22 + .run/Test.run.xml | 22 + .run/Tree.run.xml | 21 + .run/Unused Dependencies.run.xml | 21 + .run/Update.run.xml | 21 + .rustfmt.toml | 4 + CHANGELOG.md | 21 + CODE_OF_CONDUCT.md | 71 + CONTRIBUTING.md | 120 + Cargo.lock | 2981 +++++++++ Cargo.toml | 75 + LICENSE => LICENSE.md | 4 +- README.md | 67 +- SECURITY.md | 14 + codecov.yaml | 2 + deployment/.run/Install All Plugins.run.xml | 21 + deployment/Cargo.toml | 15 + deployment/post_build.rs | 42 + deployment/src/lib.rs | 1 + dynamic_graph/schema.graphql | 5597 +++++++++++++++++ graphql.config.yml | 23 + graphql/schema.graphql | 1234 ++++ plugins/binary/README.md | 21 + plugins/binary/crates/model/Cargo.toml | 30 + .../crates/model/src/component/binary_data.rs | 46 + .../model/src/component/load_binary_data.rs | 8 + .../binary/crates/model/src/component/mod.rs | 7 + .../model/src/component/save_binary_data.rs | 8 + .../model/src/entity/load_binary_data.rs | 19 + plugins/binary/crates/model/src/entity/mod.rs | 5 + .../model/src/entity/save_binary_data.rs | 19 + plugins/binary/crates/model/src/lib.rs | 10 + .../plugin/.run/Install Plugin Binary.run.xml | 21 + plugins/binary/crates/plugin/Cargo.toml | 61 + plugins/binary/crates/plugin/build.rs | 3 + plugins/binary/crates/plugin/post_build.rs | 42 + .../behaviour/component/load_binary_data.rs | 78 + .../plugin/src/behaviour/component/mod.rs | 2 + .../behaviour/component/save_binary_data.rs | 70 + .../binary/crates/plugin/src/behaviour/mod.rs | 1 + plugins/binary/crates/plugin/src/lib.rs | 4 + plugins/binary/crates/plugin/src/plugin.rs | 76 + .../binary/crates/plugin/src/providers/mod.rs | 9 + .../plugin/src/tests/load_binary_data_test.rs | 63 + plugins/binary/crates/plugin/src/tests/mod.rs | 1 + .../plugin/src/web_resource_provider.rs | 214 + .../plugin/types/components/binary_data.json | 12 + .../types/components/load_binary_data.json | 24 + .../types/components/save_binary_data.json | 24 + .../types/entities/load_binary_data.json | 122 + .../types/entities/save_binary_data.json | 122 + .../load_binary_data/create.graphql | 18 + .../graphql/get_all_binary_datas.graphql | 35 + .../graphql/load_binary_data/create.graphql | 51 + .../graphql/load_binary_data/delete.graphql | 7 + .../graphql/load_binary_data/get.graphql | 29 + .../graphql/load_binary_data/update.graphql | 43 + .../update_add_component_fs_notify.graphql | 38 + .../update_remove_component_fs_notify.graphql | 38 + .../graphql/save_binary_data/create.graphql | 46 + .../graphql/save_binary_data/update.graphql | 43 + plugins/file/README.md | 17 + plugins/file/crates/model/Cargo.toml | 26 + .../file/crates/model/src/component/file.rs | 21 + .../crates/model/src/component/fs_notify.rs | 14 + .../file/crates/model/src/component/mod.rs | 5 + plugins/file/crates/model/src/lib.rs | 5 + .../plugin/.run/Install Plugin File.run.xml | 21 + plugins/file/crates/plugin/Cargo.toml | 56 + plugins/file/crates/plugin/build.rs | 3 + plugins/file/crates/plugin/post_build.rs | 42 + .../src/behaviour/component/fs_notify.rs | 179 + .../plugin/src/behaviour/component/mod.rs | 3 + .../file/crates/plugin/src/behaviour/mod.rs | 1 + plugins/file/crates/plugin/src/lib.rs | 3 + plugins/file/crates/plugin/src/plugin.rs | 45 + plugins/file/crates/plugin/src/providers.rs | 5 + .../crates/plugin/types/components/file.json | 20 + .../plugin/types/components/fs_notify.json | 26 + .../create_load_json_with_fs_notify.graphql | 46 + .../get_load_json_with_fs_notify.graphql | 23 + plugins/system-environment/README.md | 18 + .../crates/model/Cargo.toml | 24 + .../crates/model/src/entity/mod.rs | 3 + .../crates/model/src/entity/system_env.rs | 11 + .../crates/model/src/lib.rs | 9 + .../crates/plugin/Cargo.toml | 50 + .../system-environment/crates/plugin/build.rs | 3 + .../crates/plugin/post_build.rs | 42 + .../crates/plugin/src/factory.rs | 84 + .../crates/plugin/src/lib.rs | 5 + .../crates/plugin/src/plugin.rs | 39 + .../crates/plugin/src/providers.rs | 5 + .../crates/plugin/src/tests/mod.rs | 1 + .../plugin/types/entities/system_env.json | 114 + .../graphql/find_system_env_cargo.graphql | 20 + .../find_system_env_desktop_session.graphql | 20 + .../graphql/find_system_env_display.graphql | 20 + .../graphql/find_system_env_home.graphql | 19 + .../graphql/find_system_env_lang.graphql | 20 + .../graphql/find_system_env_path.graphql | 20 + .../graphql/find_system_env_pwd.graphql | 20 + .../graphql/find_system_env_username.graphql | 20 + ...ind_system_env_xdg_current_desktop.graphql | 20 + .../find_system_env_xdg_data_dirs.graphql | 20 + .../get_system_environment_variables.graphql | 21 + 142 files changed, 14304 insertions(+), 13 deletions(-) create mode 100644 .cargo/config.toml create mode 100644 .deployment.toml create mode 100644 .gitattributes create mode 100644 .github/FUNDING.yml create mode 100644 .github/auto_assign.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/labeler.yml create mode 100644 .github/workflows/add_labels.yml create mode 100644 .github/workflows/audit.yml create mode 100644 .github/workflows/book.yml create mode 100644 .github/workflows/coverage.yml create mode 100644 .github/workflows/docs.yml create mode 100644 .github/workflows/mark-stale-prs.yml create mode 100644 .github/workflows/msrv.yml create mode 100644 .github/workflows/pr-auto-assign.yml create mode 100644 .github/workflows/pr-labeler.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/remove_labels.yml create mode 100644 .github/workflows/rust.yml create mode 100644 .github/workflows/wip.yml create mode 100644 .run/Audit.run.xml create mode 100644 .run/Build Nightly.run.xml create mode 100644 .run/Build Release aarch64.run.xml create mode 100644 .run/Build Release armv7.run.xml create mode 100644 .run/Build Release.run.xml create mode 100644 .run/Build.run.xml create mode 100644 .run/Bundle Deb aarch64.run.xml create mode 100644 .run/Bundle Deb armv7.run.xml create mode 100644 .run/Bundle Deb x86_64.run.xml create mode 100644 .run/Check Formatting.run.xml create mode 100644 .run/Clean.run.xml create mode 100644 .run/Clippy.run.xml create mode 100644 .run/Docs.run.xml create mode 100644 .run/Outdated.run.xml create mode 100644 .run/Tarpaulin.run.xml create mode 100644 .run/Test Nightly.run.xml create mode 100644 .run/Test.run.xml create mode 100644 .run/Tree.run.xml create mode 100644 .run/Unused Dependencies.run.xml create mode 100644 .run/Update.run.xml create mode 100644 .rustfmt.toml create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Cargo.lock create mode 100644 Cargo.toml rename LICENSE => LICENSE.md (89%) create mode 100644 SECURITY.md create mode 100644 codecov.yaml create mode 100644 deployment/.run/Install All Plugins.run.xml create mode 100644 deployment/Cargo.toml create mode 100644 deployment/post_build.rs create mode 100644 deployment/src/lib.rs create mode 100644 dynamic_graph/schema.graphql create mode 100644 graphql.config.yml create mode 100644 graphql/schema.graphql create mode 100644 plugins/binary/README.md create mode 100644 plugins/binary/crates/model/Cargo.toml create mode 100644 plugins/binary/crates/model/src/component/binary_data.rs create mode 100644 plugins/binary/crates/model/src/component/load_binary_data.rs create mode 100644 plugins/binary/crates/model/src/component/mod.rs create mode 100644 plugins/binary/crates/model/src/component/save_binary_data.rs create mode 100644 plugins/binary/crates/model/src/entity/load_binary_data.rs create mode 100644 plugins/binary/crates/model/src/entity/mod.rs create mode 100644 plugins/binary/crates/model/src/entity/save_binary_data.rs create mode 100644 plugins/binary/crates/model/src/lib.rs create mode 100644 plugins/binary/crates/plugin/.run/Install Plugin Binary.run.xml create mode 100644 plugins/binary/crates/plugin/Cargo.toml create mode 100644 plugins/binary/crates/plugin/build.rs create mode 100644 plugins/binary/crates/plugin/post_build.rs create mode 100644 plugins/binary/crates/plugin/src/behaviour/component/load_binary_data.rs create mode 100644 plugins/binary/crates/plugin/src/behaviour/component/mod.rs create mode 100644 plugins/binary/crates/plugin/src/behaviour/component/save_binary_data.rs create mode 100644 plugins/binary/crates/plugin/src/behaviour/mod.rs create mode 100644 plugins/binary/crates/plugin/src/lib.rs create mode 100644 plugins/binary/crates/plugin/src/plugin.rs create mode 100644 plugins/binary/crates/plugin/src/providers/mod.rs create mode 100644 plugins/binary/crates/plugin/src/tests/load_binary_data_test.rs create mode 100644 plugins/binary/crates/plugin/src/tests/mod.rs create mode 100644 plugins/binary/crates/plugin/src/web_resource_provider.rs create mode 100644 plugins/binary/crates/plugin/types/components/binary_data.json create mode 100644 plugins/binary/crates/plugin/types/components/load_binary_data.json create mode 100644 plugins/binary/crates/plugin/types/components/save_binary_data.json create mode 100644 plugins/binary/crates/plugin/types/entities/load_binary_data.json create mode 100644 plugins/binary/crates/plugin/types/entities/save_binary_data.json create mode 100644 plugins/binary/dynamic_graph/load_binary_data/create.graphql create mode 100644 plugins/binary/graphql/get_all_binary_datas.graphql create mode 100644 plugins/binary/graphql/load_binary_data/create.graphql create mode 100644 plugins/binary/graphql/load_binary_data/delete.graphql create mode 100644 plugins/binary/graphql/load_binary_data/get.graphql create mode 100644 plugins/binary/graphql/load_binary_data/update.graphql create mode 100644 plugins/binary/graphql/load_binary_data/update_add_component_fs_notify.graphql create mode 100644 plugins/binary/graphql/load_binary_data/update_remove_component_fs_notify.graphql create mode 100644 plugins/binary/graphql/save_binary_data/create.graphql create mode 100644 plugins/binary/graphql/save_binary_data/update.graphql create mode 100644 plugins/file/README.md create mode 100644 plugins/file/crates/model/Cargo.toml create mode 100644 plugins/file/crates/model/src/component/file.rs create mode 100644 plugins/file/crates/model/src/component/fs_notify.rs create mode 100644 plugins/file/crates/model/src/component/mod.rs create mode 100644 plugins/file/crates/model/src/lib.rs create mode 100644 plugins/file/crates/plugin/.run/Install Plugin File.run.xml create mode 100644 plugins/file/crates/plugin/Cargo.toml create mode 100644 plugins/file/crates/plugin/build.rs create mode 100644 plugins/file/crates/plugin/post_build.rs create mode 100644 plugins/file/crates/plugin/src/behaviour/component/fs_notify.rs create mode 100644 plugins/file/crates/plugin/src/behaviour/component/mod.rs create mode 100644 plugins/file/crates/plugin/src/behaviour/mod.rs create mode 100644 plugins/file/crates/plugin/src/lib.rs create mode 100644 plugins/file/crates/plugin/src/plugin.rs create mode 100644 plugins/file/crates/plugin/src/providers.rs create mode 100644 plugins/file/crates/plugin/types/components/file.json create mode 100644 plugins/file/crates/plugin/types/components/fs_notify.json create mode 100644 plugins/file/graphql/create_load_json_with_fs_notify.graphql create mode 100644 plugins/file/graphql/get_load_json_with_fs_notify.graphql create mode 100644 plugins/system-environment/README.md create mode 100644 plugins/system-environment/crates/model/Cargo.toml create mode 100644 plugins/system-environment/crates/model/src/entity/mod.rs create mode 100644 plugins/system-environment/crates/model/src/entity/system_env.rs create mode 100644 plugins/system-environment/crates/model/src/lib.rs create mode 100644 plugins/system-environment/crates/plugin/Cargo.toml create mode 100644 plugins/system-environment/crates/plugin/build.rs create mode 100644 plugins/system-environment/crates/plugin/post_build.rs create mode 100644 plugins/system-environment/crates/plugin/src/factory.rs create mode 100644 plugins/system-environment/crates/plugin/src/lib.rs create mode 100644 plugins/system-environment/crates/plugin/src/plugin.rs create mode 100644 plugins/system-environment/crates/plugin/src/providers.rs create mode 100644 plugins/system-environment/crates/plugin/src/tests/mod.rs create mode 100644 plugins/system-environment/crates/plugin/types/entities/system_env.json create mode 100644 plugins/system-environment/graphql/find_system_env_cargo.graphql create mode 100644 plugins/system-environment/graphql/find_system_env_desktop_session.graphql create mode 100644 plugins/system-environment/graphql/find_system_env_display.graphql create mode 100644 plugins/system-environment/graphql/find_system_env_home.graphql create mode 100644 plugins/system-environment/graphql/find_system_env_lang.graphql create mode 100644 plugins/system-environment/graphql/find_system_env_path.graphql create mode 100644 plugins/system-environment/graphql/find_system_env_pwd.graphql create mode 100644 plugins/system-environment/graphql/find_system_env_username.graphql create mode 100644 plugins/system-environment/graphql/find_system_env_xdg_current_desktop.graphql create mode 100644 plugins/system-environment/graphql/find_system_env_xdg_data_dirs.graphql create mode 100644 plugins/system-environment/graphql/get_system_environment_variables.graphql diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..a181667 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,9 @@ +[target.aarch64-unknown-linux-gnu] +objcopy = { path ="aarch64-linux-gnu-objcopy" } +strip = { path ="aarch64-linux-gnu-strip" } +linker = "aarch64-linux-gnu-gcc" + +[target.armv7-unknown-linux-gnueabihf] +objcopy = { path ="arm-none-eabi-objcopy" } +strip = { path ="arm-none-eabi-strip" } +linker = "arm-linux-gnueabihf-gcc" diff --git a/.deployment.toml b/.deployment.toml new file mode 100644 index 0000000..8a9691a --- /dev/null +++ b/.deployment.toml @@ -0,0 +1,3 @@ +target_dirs = [ + "../inexor-rgf/plugins/deploy" +] diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9602cc4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +book/* linguist-documentation +tools/* linguist-vendored diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..4075d7b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +open_collective: reactive-graph diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml new file mode 100644 index 0000000..8c93ca9 --- /dev/null +++ b/.github/auto_assign.yml @@ -0,0 +1,6 @@ +addAssignees: author +numberOfAssignees: 0 +addReviewers: true +numberOfReviewers: 0 +reviewers: + - aschaeffer diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..d73fcc9 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,32 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + day: "friday" + time: "18:00" + timezone: "Europe/Berlin" + labels: + - "p:continuous-integration" + - package-ecosystem: "cargo" + directory: "/" + schedule: + interval: "daily" + time: "18:00" + timezone: "Europe/Berlin" + labels: + - "p:dependencies" + open-pull-requests-limit: 10 + reviewers: + - "reactive-graph/code-contributors" + groups: + rust-dependencies: + update-types: + - "minor" + - "patch" diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 0000000..2f5b873 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,80 @@ +p:documentation: + - changed-files: + - any-glob-to-any-file: + - CHANGELOG.md + - CODE_OF_CONDUCT.md + - CONTRIBUTING.md + - README.md + - SECURITY.md + - book/** + - docs/** + - .github/workflows/docs.yml +p:continuous-integration: + - changed-files: + - any-glob-to-any-file: + - .github/workflows/** + - .github/dependabot.yml + - .github/labeler.yml + - .github/pr-labeler.yml +p:distribution: + - changed-files: + - any-glob-to-any-file: + - Dockerfile + - .github/workflows/release.yml + - .github/workflows/docker.yml +p:build-system: + - changed-files: + - any-glob-to-any-file: + - clippy.toml + - .rustfmt.toml + - codecov.yaml + - .github/workflows/msrv.yml +p:dependencies: + - changed-files: + - any-glob-to-any-file: + - Cargo.toml + - Cargo.lock + - crates/**/Cargo.toml + - .github/workflows/dependabot-approve-and-auto-merge.yml +c:command-system: + - changed-files: + - any-glob-to-any-file: + - crates/command/** +c:plugin-system: + - changed-files: + - any-glob-to-any-file: + - crates/plugin/** +c:runtime: + - changed-files: + - any-glob-to-any-file: + - crates/runtime/** +c:rust-client: + - changed-files: + - any-glob-to-any-file: + - crates/client/** +c:instance-system: + - changed-files: + - any-glob-to-any-file: + - crates/instance-system/** +c:reactive-behaviour-system: + - changed-files: + - any-glob-to-any-file: + - crates/behaviour/** + - crates/reactive/** +c:security: + - changed-files: + - any-glob-to-any-file: + - SECURITY.md +c:type-system: + - changed-files: + - any-glob-to-any-file: + - crates/type-system/** +i:dynamic-graph: + - changed-files: + - any-glob-to-any-file: + - crates/dynamic-graph/** +i:graphql: + - changed-files: + - any-glob-to-any-file: + - crates/graphql/** + - crates/runtime/graphql/** diff --git a/.github/workflows/add_labels.yml b/.github/workflows/add_labels.yml new file mode 100644 index 0000000..f7b4765 --- /dev/null +++ b/.github/workflows/add_labels.yml @@ -0,0 +1,15 @@ +name: Add Labels + +on: + issues: + types: [ opened ] + +jobs: + add_labels: + runs-on: ubuntu-22.04 + steps: + - name: Add labels + uses: andymckay/labeler@master + with: + add-labels: "o:triage" + ignore-if-labeled: true diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml new file mode 100644 index 0000000..d99e29c --- /dev/null +++ b/.github/workflows/audit.yml @@ -0,0 +1,31 @@ +name: Security audit +on: + push: + branches: [ main ] + paths: + - "plugins/**/Cargo.toml" + - "Cargo.toml" + - "Cargo.lock" + - ".github/workflows/audit.yml" + pull_request: + branches: [ main ] + paths: + - "plugins/**/Cargo.toml" + - "Cargo.toml" + - "Cargo.lock" + - ".github/workflows/audit.yml" + schedule: + - cron: "0 12 * * 0" + # Run manually + workflow_dispatch: + +jobs: + audit: + runs-on: ubuntu-22.04 + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + - name: Audit Rust Dependencies + uses: rustsec/audit-check@v2.0.0 + with: + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml new file mode 100644 index 0000000..ccc87e3 --- /dev/null +++ b/.github/workflows/book.yml @@ -0,0 +1,69 @@ +name: Book + +on: + push: + branches: [ main ] + paths: + - "book/**" + - "plugins/*/README.md" + - "CHANGELOG.md" + - "CODE_OF_CONDUCT.md" + - "CONTRIBUTING.md" + - "LICENSE.md" + - "README.md" + - "SECURITY.md" + - ".github/workflows/book.yml" + pull_request: + branches: [ main ] + paths: + - "book/**" + - "CHANGELOG.md" + - "CODE_OF_CONDUCT.md" + - "CONTRIBUTING.md" + - "LICENSE.md" + - "README.md" + - "SECURITY.md" + - ".github/workflows/book.yml" + +env: + CARGO_TERM_COLOR: always + +jobs: + book: + name: Book + runs-on: ubuntu-22.04 + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Install rust toolchain + uses: dtolnay/rust-toolchain@stable + - name: Setup mdBook + uses: peaceiris/actions-mdbook@v2 + with: + mdbook-version: 'latest' + - name: Install preprocessor mdbook-admonish + uses: taiki-e/cache-cargo-install-action@v2 + with: + tool: mdbook-admonish + - name: Install preprocessor mdbook-mermaid + uses: taiki-e/cache-cargo-install-action@v2 + with: + tool: mdbook-mermaid + + - name: Install preprocessor mdbook-preprocessor-graphql-playground + uses: taiki-e/cache-cargo-install-action@v2 + with: + tool: mdbook-preprocessor-graphql-playground + - name: Build Book + working-directory: ./book + run: mdbook build + - name: Deploy + uses: peaceiris/actions-gh-pages@v4 + if: ${{ github.ref == 'refs/heads/main' }} + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./book/book + destination_dir: book + cname: sys.reactive-graph.io diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000..d3df7ec --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,52 @@ +name: Code Coverage + +on: + push: + branches: [ main ] + paths: + - "plugins/*/crates/**/*.rs" + - "plugins/*/crates/**/Cargo.toml" + - "Cargo.toml" + - ".github/workflows/coverage.yml" + pull_request: + branches: [ main ] + paths: + - "plugins/*/crates/**/*.rs" + - "plugins/*/crates/**/Cargo.toml" + - "Cargo.toml" + - ".github/workflows/coverage.yml" + +env: + CARGO_TERM_COLOR: always + SCCACHE_GHA_ENABLED: "true" + RUSTC_WRAPPER: "sccache" + +jobs: + codecov-tarpaulin: + name: Generate code coverage + runs-on: ubuntu-22.04 + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + - name: Install latest nightly + uses: dtolnay/rust-toolchain@master + with: + toolchain: nightly-2025-03-14 + components: rustfmt, rust-src + - name: Install tarpaulin + uses: taiki-e/cache-cargo-install-action@v2 + with: + tool: tarpaulin + - name: Cache dependencies + uses: Swatinem/rust-cache@v2 + - name: Run sccache-cache + uses: mozilla-actions/sccache-action@v0.0.9 + - name: Run cargo-tarpaulin + run: cargo +nightly tarpaulin --engine llvm --verbose --all-features --workspace --timeout 120 --out xml + # Note: closed-source code needs to provide a token, + # but open source code does not. + - name: Upload to codecov.io + uses: codecov/codecov-action@v5.4.2 + with: + verbose: true + fail_ci_if_error: true diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..4cc5a82 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,63 @@ +name: Documentation + +on: + push: + branches: [ main ] + paths: + - "plugins/*/crates/**/*.rs" + - "plugins/*/crates/**/Cargo.toml" + - "Cargo.toml" + - ".github/workflows/docs.yml" + pull_request: + branches: [ main ] + paths: + - "plugins/*/crates/*/*.rs" + - "plugins/*/crates/*/Cargo.toml" + - "Cargo.toml" + - ".github/workflows/docs.yml" + +env: + CARGO_TERM_COLOR: always + SCCACHE_GHA_ENABLED: "true" + RUSTC_WRAPPER: "sccache" + RUSTDOCFLAGS: --enable-index-page -Zunstable-options + +jobs: + docs: + name: Documentation + runs-on: ubuntu-22.04 + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + - name: Install latest nightly + uses: dtolnay/rust-toolchain@master + with: + toolchain: nightly-2025-03-14 + components: rustfmt, rust-src + - name: Setup Node.js 18 + uses: actions/setup-node@v4 + with: + node-version: 18 + - name: Install Yarn + uses: borales/actions-yarn@v5 + with: + cmd: --cwd plugins/graphql-client/web install + - name: Install Yarn + uses: borales/actions-yarn@v5 + with: + cmd: --cwd plugins/graphql-schema-visualization/web install + - name: Cache dependencies + uses: Swatinem/rust-cache@v2 + - name: Run sccache-cache + uses: mozilla-actions/sccache-action@v0.0.9 + - name: Run cargo doc + run: cargo doc --all --no-deps + - name: Deploy + uses: peaceiris/actions-gh-pages@v4 + if: ${{ github.ref == 'refs/heads/main' }} + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./target/doc + destination_dir: docs + cname: sys.reactive-graph.io + # keep_files: true diff --git a/.github/workflows/mark-stale-prs.yml b/.github/workflows/mark-stale-prs.yml new file mode 100644 index 0000000..79b687a --- /dev/null +++ b/.github/workflows/mark-stale-prs.yml @@ -0,0 +1,27 @@ +name: Mark stale pull requests + +on: + schedule: + - cron: '35 19 * * *' + workflow_dispatch: + +jobs: + stale: + runs-on: ubuntu-22.04 + permissions: + pull-requests: write + steps: + - uses: actions/stale@v9 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + days-before-pr-stale: 28 + days-before-issue-stale: -1 # don't mark issues as stale + exempt-draft-pr: true # don't mark draft PRs as stale + days-before-close: -1 # don't close stale PRs/issues + stale-pr-label: o:stale + stale-pr-message: > + This PR has not had activity in the past 4 weeks, labeling it as stale. + If the PR is waiting for review, notify the dev@lucene.apache.org list. + Thank you for your contribution! + debug-only: false # turn on to run the action without applying changes + operations-per-run: 500 # operations budget diff --git a/.github/workflows/msrv.yml b/.github/workflows/msrv.yml new file mode 100644 index 0000000..4b2b356 --- /dev/null +++ b/.github/workflows/msrv.yml @@ -0,0 +1,45 @@ +name: MSRV + +on: + push: + branches: [ main ] + paths: + - "crates/**/*.rs" + - "crates/**/Cargo.toml" + - "Cargo.toml" + - "Cargo.lock" + - ".github/workflows/msrv.yml" + pull_request: + branches: [ main ] + paths: + - "crates/**/*.rs" + - "crates/**/Cargo.toml" + - "Cargo.toml" + - "Cargo.lock" + - ".github/workflows/msrv.yml" + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + runs-on: ubuntu-22.04 + continue-on-error: true + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + - name: Install rust toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: nightly-2025-03-14 + - name: Install cargo msrv + uses: taiki-e/cache-cargo-install-action@v2 + with: + tool: cargo-msrv@0.16.0-beta.25 + - name: Version of cargo msrv + run: cargo msrv --version + - name: Run cargo msrv + run: cargo msrv --path plugins/base/crates/plugin --output-format json verify + - name: Run cargo msrv on verify failure + if: ${{ failure() }} + run: cargo msrv find --output-format json diff --git a/.github/workflows/pr-auto-assign.yml b/.github/workflows/pr-auto-assign.yml new file mode 100644 index 0000000..7dc6607 --- /dev/null +++ b/.github/workflows/pr-auto-assign.yml @@ -0,0 +1,18 @@ +name: Auto Assign +run-name: Auto Assign Pull Request ${{ github.ref_name }} by @${{ github.actor }} + +on: + pull_request_target: + types: + - opened + - ready_for_review + +permissions: + pull-requests: write + contents: write + +jobs: + auto-assign: + runs-on: ubuntu-22.04 + steps: + - uses: kentaro-m/auto-assign-action@v2.0.0 diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml new file mode 100644 index 0000000..d41e814 --- /dev/null +++ b/.github/workflows/pr-labeler.yml @@ -0,0 +1,14 @@ +name: Pull Request Labeler +run-name: Labeling Pull Request on ${{ github.ref_name }} by @${{ github.actor }} + +on: + - pull_request_target + +jobs: + labeler: + runs-on: ubuntu-22.04 + permissions: + contents: read + pull-requests: write + steps: + - uses: actions/labeler@v5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..6545013 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,255 @@ +name: Release + +permissions: + contents: write + +on: + push: + tags: + - v[0-9]+.* + +env: + CARGO_TERM_COLOR: always + WORKSPACE_ROOT_MANIFEST_DIR: "/home/runner/work/sys/sys" + +jobs: + create-release: + runs-on: ubuntu-22.04 + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + - name: Create GitHub Release + uses: taiki-e/create-gh-release-action@v1 + with: + changelog: CHANGELOG.md + token: ${{ secrets.GITHUB_TOKEN }} + # upload-assets: + # strategy: + # matrix: + # include: + # # Tier 1 + # - target: x86_64-unknown-linux-gnu + # os: ubuntu-22.04 + # # Tier 1 + # - target: aarch64-unknown-linux-gnu + # os: ubuntu-22.04 + # # Tier 2 + # - target: armv7-unknown-linux-gnueabihf + # os: ubuntu-22.04 + # # Tier 1 + # - target: x86_64-apple-darwin + # os: macos-latest + # # Tier 2 + # - target: aarch64-apple-darwin + # os: macos-latest + # # Universal macOS binary is supported as universal-apple-darwin. + # - target: universal-apple-darwin + # os: macos-latest + # # Tier 1 + # - target: x86_64-pc-windows-msvc + # os: windows-latest + # # Tier 2 + # # - target: aarch64-pc-windows-msvc + # # os: windows-latest + # runs-on: ${{ matrix.os }} + # steps: + # - name: VCS Checkout + # uses: actions/checkout@v4 + # # Required by arm targets + # - name: Install packages + # uses: awalsh128/cache-apt-pkgs-action@latest + # with: + # packages: pkg-config openssl libssl-dev + # version: 1.1 + # if: matrix.os == 'ubuntu-22.04' + # - name: Setup Node.js 18 + # uses: actions/setup-node@v4 + # with: + # node-version: 18 + # - name: Install Yarn + # uses: borales/actions-yarn@v5 + # with: + # cmd: --cwd plugins/graphql-client/web install + # - name: Install Yarn + # uses: borales/actions-yarn@v5 + # with: + # cmd: --cwd plugins/graphql-schema-visualization/web install + # - name: Upload Rust Binary + # uses: taiki-e/upload-rust-binary-action@v1 + # with: + # bin: libinexor_rgf_plugin_standalone + # target: ${{ matrix.target }} + # include: LICENSE.md,README.md,CHANGELOG.md,config,plugins + # tar: unix + # zip: windows + # leading_dir: true + # token: ${{ secrets.GITHUB_TOKEN }} + # env: + # VERGEN_IDEMPOTENT: true + # crates-io: + # name: Publish on crates.io + # runs-on: ubuntu-22.04 + # steps: + # - name: VCS Checkout + # uses: actions/checkout@v4 + # - name: Install latest nightly + # uses: actions-rs/toolchain@v1 + # with: + # profile: minimal + # toolchain: nightly + # override: true + # - name: Setup Node.js 18 + # uses: actions/setup-node@v4 + # with: + # node-version: 18 + # - name: Install Yarn + # uses: borales/actions-yarn@v5 + # with: + # cmd: --cwd plugins/graphql-client/web install + # - name: Install Yarn + # uses: borales/actions-yarn@v5 + # with: + # cmd: --cwd plugins/graphql-schema-visualization/web install + # - name: Install Cargo Workspaces + # uses: actions-rs/install@v0.1 + # with: + # crate: cargo-workspaces + # version: latest + # use-tool-cache: true + # - name: Print environment variables + # run: | + # echo "WORKSPACE_ROOT_MANIFEST_DIR: $WORKSPACE_ROOT_MANIFEST_DIR" + # - name: Publish on crates.io + # uses: actions-rs/cargo@v1 + # with: + # command: workspaces + # args: publish --from-git --allow-dirty --no-verify + # env: + # CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + # VERGEN_IDEMPOTENT: true + debian-package: + name: Publish debian package + strategy: + matrix: + include: + - target: x86_64-unknown-linux-gnu + os: ubuntu-20.04 + - target: aarch64-unknown-linux-gnu + os: ubuntu-20.04 + - target: armv7-unknown-linux-gnueabihf + os: ubuntu-20.04 + runs-on: ${{ matrix.os }} + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + - name: Get version number from git tag + id: tag + uses: devops-actions/action-get-tag@v1.0.3 + with: + strip_v: true + - name: Install aarch64 packages + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu + version: 1.0 + if: matrix.target == 'aarch64-unknown-linux-gnu' + - name: Install armv7 packages + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: binutils-arm-none-eabi gcc-arm-linux-gnueabihf + version: 1.0 + if: matrix.target == 'armv7-unknown-linux-gnueabihf' + - name: Install latest nightly + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + override: true + - name: Install Cargo Deb + uses: actions-rs/install@v0.1 + with: + crate: cargo-deb + version: latest + use-tool-cache: true + - name: Install cross-compilation tools + uses: taiki-e/setup-cross-toolchain-action@v1 + with: + target: ${{ matrix.target }} + - name: Setup Node.js 18 + uses: actions/setup-node@v4 + with: + node-version: 18 + - name: Install Yarn + uses: borales/actions-yarn@v5 + with: + cmd: --cwd plugins/graphql-client/web install + - name: Install Yarn + uses: borales/actions-yarn@v5 + with: + cmd: --cwd plugins/graphql-schema-visualization/web install + - name: Create Debian Package + run: | + # It's important to change into the plugin directory and building each package + cd ./plugins/arithmetic/crates/plugin + cargo deb -p reactive-graph-plugin-arithmetic --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../base/crates/plugin + cargo deb -p reactive-graph-plugin-base --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../binary/crates/plugin + cargo deb -p reactive-graph-plugin-binary --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../color/crates/plugin + cargo deb -p reactive-graph-plugin-color --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../comparison/crates/plugin + cargo deb -p reactive-graph-plugin-comparison --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../config/crates/plugin + cargo deb -p reactive-graph-plugin-config --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../connector/crates/plugin + cargo deb -p reactive-graph-plugin-connector --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../date-time/crates/plugin + cargo deb -p reactive-graph-plugin-date-time --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../file/crates/plugin + cargo deb -p reactive-graph-plugin-file --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../flow/crates/plugin + cargo deb -p reactive-graph-plugin-flow --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../git/crates/plugin + cargo deb -p reactive-graph-plugin-git --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../http/crates/plugin + cargo deb -p reactive-graph-plugin-http --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + # cd ../../../i18n/crates/plugin + # cargo deb -p reactive-graph-plugin-i18n --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../json/crates/plugin + cargo deb -p reactive-graph-plugin-json --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../logical/crates/plugin + cargo deb -p reactive-graph-plugin-logical --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../metadata/crates/plugin + cargo deb -p reactive-graph-plugin-metadata --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../numeric/crates/plugin + cargo deb -p reactive-graph-plugin-numeric --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../random/crates/plugin + cargo deb -p reactive-graph-plugin-random --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../result/crates/plugin + cargo deb -p reactive-graph-plugin-result --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../state/crates/plugin + cargo deb -p reactive-graph-plugin-state --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../string/crates/plugin + cargo deb -p reactive-graph-plugin-string --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../system-environment/crates/plugin + cargo deb -p reactive-graph-plugin-system-environment --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../taxonomy/crates/plugin + cargo deb -p reactive-graph-plugin-taxonomy --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../trigger/crates/plugin + cargo deb -p reactive-graph-plugin-trigger --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../value/crates/plugin + cargo deb -p reactive-graph-plugin-value --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../../../graphql-client + cargo deb -p reactive-graph-plugin-graphql-client --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + cd ../graphql-schema-visualization + cargo deb -p reactive-graph-plugin-graphql-schema-visualization --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} + env: + VERGEN_IDEMPOTENT: true + - name: Upload debian package to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: target/${{ matrix.target }}/debian/libreactive-graph-plugin-*_*_*.deb + file_glob: true + tag: ${{ github.ref }} diff --git a/.github/workflows/remove_labels.yml b/.github/workflows/remove_labels.yml new file mode 100644 index 0000000..59d2f01 --- /dev/null +++ b/.github/workflows/remove_labels.yml @@ -0,0 +1,16 @@ +name: Remove Labels + +on: + issues: + types: [ closed ] + pull_request: + types: [ closed ] + +jobs: + remove_labels: + runs-on: ubuntu-22.04 + steps: + - name: Remove labels + uses: andymckay/labeler@master + with: + remove-labels: "o:triage, o:good-first-issue, o:help-wanted, o:question, o:stale" diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..11319ce --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,166 @@ +name: Rust +run-name: Build ${{ github.ref == 'refs/heads/main' && 'Nightly' || github.event_name == 'pull_request' && format('{0} {1}', 'Pull Request', github.event.pull_request.number) || format('{0} {1}', 'Branch', github.ref) }} by @${{ github.actor }} + +on: + push: + branches: [ main ] + paths: + - "plugins/**/crates/**/*.rs" + - "plugins/**/crates/**/Cargo.toml" + - "Cargo.toml" + - "Cargo.lock" + - "CHANGELOG.md" + - ".github/workflows/rust.yml" + pull_request: + branches: [ main ] + paths: + - "plugins/*/crates/**/*.rs" + - "plugins/**/crates/**/Cargo.toml" + - "Cargo.toml" + - "Cargo.lock" + - "CHANGELOG.md" + - ".github/workflows/rust.yml" + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +env: + CARGO_TERM_COLOR: always + SCCACHE_GHA_ENABLED: "true" + RUSTC_WRAPPER: "sccache" + AWS_LC_SYS_PREBUILT_NASM: 1 + +jobs: + formatting: + name: Verify code formatting + runs-on: ubuntu-22.04 + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + - name: Install latest nightly + uses: dtolnay/rust-toolchain@master + with: + toolchain: nightly-2025-03-14 + components: rustfmt + - name: Run cargo fmt + run: cargo fmt --all -- --check + check_changelog: + name: Check Changelog + runs-on: ubuntu-22.04 + steps: + - uses: tarides/changelog-check-action@v3 + with: + changelog: CHANGELOG.md + if: github.actor != 'dependabot[bot]' + lint: + name: Lint + needs: [ formatting, check_changelog ] + if: always() && (!contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')) + runs-on: ubuntu-22.04 + strategy: + matrix: + toolchain: [ stable, nightly-2025-03-14 ] + target: [ x86_64-unknown-linux-gnu, x86_64-unknown-linux-musl ] + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + - name: Install rust toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.toolchain }} + target: ${{ matrix.target }} + components: clippy + - name: Setup Node.js 18 + uses: actions/setup-node@v4 + with: + node-version: 18 + - name: Install Yarn + uses: borales/actions-yarn@v5 + with: + cmd: --cwd plugins/graphql-client/web install + - name: Install Yarn + uses: borales/actions-yarn@v5 + with: + cmd: --cwd plugins/graphql-schema-visualization/web install + - name: Cache dependencies + uses: Swatinem/rust-cache@v2 + - name: Run sccache-cache + uses: mozilla-actions/sccache-action@v0.0.9 + - name: Run cargo clippy + run: cargo clippy + build: + name: Release Build + needs: [ lint ] + if: always() && (!contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')) + strategy: + matrix: + os: [ ubuntu-22.04, ubuntu-22.04-arm, macos-latest, windows-latest ] + toolchain: [ stable, nightly-2025-03-14 ] + runs-on: ${{ matrix.os }} + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + - name: Install rust toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.toolchain }} + - name: Setup Node.js 18 + uses: actions/setup-node@v4 + with: + node-version: 18 + - name: Install Yarn + uses: borales/actions-yarn@v5 + with: + cmd: --cwd plugins/graphql-client/web install + - name: Install Yarn + uses: borales/actions-yarn@v5 + with: + cmd: --cwd plugins/graphql-schema-visualization/web install + - name: Cache dependencies + uses: Swatinem/rust-cache@v2 + - name: Run sccache-cache + uses: mozilla-actions/sccache-action@v0.0.9 + - name: Build (Release Mode) + run: cargo build --release --verbose + test: + name: Tests + needs: [ lint ] + if: always() && (!contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')) + strategy: + matrix: + toolchain: [ stable, nightly-2025-03-14 ] + target: [ x86_64-unknown-linux-gnu, x86_64-unknown-linux-musl ] + runs-on: ubuntu-22.04 + steps: + - name: VCS Checkout + uses: actions/checkout@v4 + - name: Install rust toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.toolchain }} + target: ${{ matrix.target }} + - name: Install musl-tools + uses: awalsh128/cache-apt-pkgs-action@v1 + with: + packages: musl-tools # provides musl-gcc + version: 1.0 + if: matrix.target == 'x86_64-unknown-linux-musl' + - name: Setup Node.js 18 + uses: actions/setup-node@v4 + with: + node-version: 18 + - name: Install Yarn + uses: borales/actions-yarn@v5 + with: + cmd: --cwd plugins/graphql-client/web install + - name: Install Yarn + uses: borales/actions-yarn@v5 + with: + cmd: --cwd plugins/graphql-schema-visualization/web install + - name: Cache dependencies + uses: Swatinem/rust-cache@v2 + - name: Run sccache-cache + uses: mozilla-actions/sccache-action@v0.0.9 + - name: Test (Release Mode) + run: cargo test --release --verbose --target ${{ matrix.target }} diff --git a/.github/workflows/wip.yml b/.github/workflows/wip.yml new file mode 100644 index 0000000..c92ae82 --- /dev/null +++ b/.github/workflows/wip.yml @@ -0,0 +1,15 @@ +name: WIP +on: + pull_request: + types: [ opened, synchronize, reopened, edited ] + +permissions: + statuses: write + +jobs: + wip: + runs-on: ubuntu-22.04 + steps: + - uses: wip/action@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 0104787..54fc50c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,28 @@ # Generated by Cargo # will have compiled files and executables -debug/ -target/ +/target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +# Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk -# MSVC Windows builds of rustc generate these, which store debugging information -*.pdb +# Prevent tokens to be commited +**/*.token + +# Prevent test coverage results to be commited +cobertura.xml +tarpaulin-report.html + +# Exclude IDE project files +.idea + +**/node_modules + +**/yarn-error.log +**/yarn.lock -# RustRover -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ \ No newline at end of file +# Exclude generated frontend bundles +plugins/**/web/dist/bundle diff --git a/.run/Audit.run.xml b/.run/Audit.run.xml new file mode 100644 index 0000000..469ba61 --- /dev/null +++ b/.run/Audit.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.run/Build Nightly.run.xml b/.run/Build Nightly.run.xml new file mode 100644 index 0000000..da11c4c --- /dev/null +++ b/.run/Build Nightly.run.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/.run/Build Release aarch64.run.xml b/.run/Build Release aarch64.run.xml new file mode 100644 index 0000000..09f2077 --- /dev/null +++ b/.run/Build Release aarch64.run.xml @@ -0,0 +1,17 @@ + + + + diff --git a/.run/Build Release armv7.run.xml b/.run/Build Release armv7.run.xml new file mode 100644 index 0000000..b6befec --- /dev/null +++ b/.run/Build Release armv7.run.xml @@ -0,0 +1,17 @@ + + + + diff --git a/.run/Build Release.run.xml b/.run/Build Release.run.xml new file mode 100644 index 0000000..286cc45 --- /dev/null +++ b/.run/Build Release.run.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/.run/Build.run.xml b/.run/Build.run.xml new file mode 100644 index 0000000..b1f94ac --- /dev/null +++ b/.run/Build.run.xml @@ -0,0 +1,22 @@ + + + + diff --git a/.run/Bundle Deb aarch64.run.xml b/.run/Bundle Deb aarch64.run.xml new file mode 100644 index 0000000..0e87787 --- /dev/null +++ b/.run/Bundle Deb aarch64.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.run/Bundle Deb armv7.run.xml b/.run/Bundle Deb armv7.run.xml new file mode 100644 index 0000000..18f87e1 --- /dev/null +++ b/.run/Bundle Deb armv7.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.run/Bundle Deb x86_64.run.xml b/.run/Bundle Deb x86_64.run.xml new file mode 100644 index 0000000..9b1ee0f --- /dev/null +++ b/.run/Bundle Deb x86_64.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.run/Check Formatting.run.xml b/.run/Check Formatting.run.xml new file mode 100644 index 0000000..44af1ee --- /dev/null +++ b/.run/Check Formatting.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.run/Clean.run.xml b/.run/Clean.run.xml new file mode 100644 index 0000000..265ded3 --- /dev/null +++ b/.run/Clean.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.run/Clippy.run.xml b/.run/Clippy.run.xml new file mode 100644 index 0000000..ed376ce --- /dev/null +++ b/.run/Clippy.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.run/Docs.run.xml b/.run/Docs.run.xml new file mode 100644 index 0000000..9219761 --- /dev/null +++ b/.run/Docs.run.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/.run/Outdated.run.xml b/.run/Outdated.run.xml new file mode 100644 index 0000000..9d0c7de --- /dev/null +++ b/.run/Outdated.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.run/Tarpaulin.run.xml b/.run/Tarpaulin.run.xml new file mode 100644 index 0000000..1a4d93b --- /dev/null +++ b/.run/Tarpaulin.run.xml @@ -0,0 +1,19 @@ + + + + \ No newline at end of file diff --git a/.run/Test Nightly.run.xml b/.run/Test Nightly.run.xml new file mode 100644 index 0000000..a3fa3f2 --- /dev/null +++ b/.run/Test Nightly.run.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/.run/Test.run.xml b/.run/Test.run.xml new file mode 100644 index 0000000..79d8912 --- /dev/null +++ b/.run/Test.run.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/.run/Tree.run.xml b/.run/Tree.run.xml new file mode 100644 index 0000000..40f2ebf --- /dev/null +++ b/.run/Tree.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.run/Unused Dependencies.run.xml b/.run/Unused Dependencies.run.xml new file mode 100644 index 0000000..ae245b6 --- /dev/null +++ b/.run/Unused Dependencies.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.run/Update.run.xml b/.run/Update.run.xml new file mode 100644 index 0000000..bd0282d --- /dev/null +++ b/.run/Update.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 0000000..b9e0c8e --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,4 @@ +max_width = 160 +comment_width = 120 +fn_call_width = 110 +imports_granularity = "Item" diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f88a8cf --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,21 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Unreleased + +### Added + +### Changed + +- Refactored into new mono repo `reactive-graph/sys` +- Prefix plugins with `sys` (e.g. `libreactive_graph_sys_binary`) + +### Fixed + +### Distribution + +### Infrastructure diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..07eb8a7 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,71 @@ +# Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at ``info@reactive-graph.io``. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +For answers to common questions about this code of conduct, see +[https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..ccf8185 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,120 @@ +# Contributing + +We want to make contributing to this project as easy and transparent as possible. + +## First Steps + +If you're new, we encourage you to take a look at issues tagged +with [good first issue](https://github.com/reactive-graph/sys/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) + +## Social Media + +Join our [Discord server](https://discord.gg/KQgk5CmZQn) or follow us at [Mastodon](https://floss.social/@reactive_graph), +[Youtube](https://www.youtube.com/@reactive-graph) or [Facebook](https://www.facebook.com/reactive.graph). + +## Code of Conduct + +Please review our [Code of Conduct](https://github.com/reactive-graph/sys/blob/main/CODE_OF_CONDUCT.md). It is in effect at all times. We expect it to +be honored by everyone who contributes to this project. + +## Opening an Issue + +Before creating an issue, check if you are using the latest version of the project. If you are not up-to-date, see if updating fixes your issue first. + +## Reporting Security Issues + +Review our [Security Policy](https://github.com/reactive-graph/sys/blob/main/SECURITY.md). Do not file a public issue for security vulnerabilities. + +## Bug Reports and Other Issues + +A great way to contribute to the project is to send a detailed issue when you encounter a problem. We always appreciate a well-written, thorough bug report. + +In short, since you are most likely a developer, **provide a ticket that you would like to receive**. + +- **Do not open a duplicate issue!** Search through existing issues to see if your issue has previously been reported. If your issue exists, comment with any + additional information you have. You may simply note "I have this problem too", which helps prioritize the most common problems and requests. + +- **Prefer using [reactions](https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/)**, not comments, if you simply want to "+1" an + existing issue. + +- **Fully complete the provided issue template.** The bug report template requests all the information we need to quickly and efficiently address your issue. Be + clear, concise, and descriptive. Provide as much information as you can, including steps to reproduce, stack traces, compiler errors, library versions, OS + versions, and screenshots (if applicable). + +- **Use [GitHub-flavored Markdown](https://help.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax).** Especially put code blocks and + console outputs in backticks (```). This improves readability. + +## Feature Requests + +Feature requests are welcome! While we will consider all requests, we cannot guarantee your request will be accepted. Your idea may be great, but also +out-of-scope for the project. If accepted, we cannot make any commitments regarding the timeline for implementation and release. However, you are welcome to +submit a pull request to help! + +- **Do not open a duplicate feature request.** Search for existing feature requests first. If you find your feature (or one very similar) previously requested, + comment on that issue. + +- Be precise about the proposed outcome of the feature and how it relates to existing features. Include implementation details if possible. + +## Triaging Issues + +You can triage issues which may include reproducing bug reports or asking for additional information, such as version numbers or reproduction instructions. Any +help you can provide to quickly resolve an issue is very much appreciated! + +## Submitting Pull Requests + +We **love** pull requests! Before [forking the repo](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) +and [creating a pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/proposing-changes-to-your-work-with-pull-requests) +for non-trivial changes, it is usually best to first open an issue to discuss the changes, or discuss your intended approach for solving the problem in the +comments for an existing issue. + +For most contributions, after your first pull request is accepted and merged, you will +be [invited to the project](https://help.github.com/en/github/setting-up-and-managing-your-github-user-account/inviting-collaborators-to-a-personal-repository) +and given **push access**. + +*Note: All contributions will be licensed under the project's license.* + +- **Smaller is better.** Submit **one** pull request per bug fix or feature. A pull request should contain isolated changes pertaining to a single bug fix or + feature implementation. **Do not** refactor or reformat code that is unrelated to your change. It is better to **submit many small pull requests** rather than + a single large one. Enormous pull requests will take enormous amounts of time to review, or may be rejected altogether. + +- **Coordinate bigger changes.** For large and non-trivial changes, open an issue to discuss a strategy with the maintainers. Otherwise, you risk doing a lot of + work for nothing! + +- **Prioritize understanding over cleverness.** Write code clearly and concisely. Remember that source code usually gets written once and read often. Ensure the + code is clear to the reader. The purpose and logic should be obvious to a reasonably skilled developer, otherwise you should add a comment that explains it. + +- **Follow existing coding style and conventions.** Keep your code consistent with the style, formatting, and conventions in the rest of the code base. When + possible, these will be enforced with a linter. Consistency makes it easier to review and modify in the future. + +- **Include test coverage.** Add unit tests when possible. Follow existing patterns for implementing tests. + +- **Add documentation.** Document your changes with code doc comments or in existing guides. + +- **Update the CHANGELOG** for all enhancements and bug fixes. + +- **Use the repo's default branch.** Branch from + and [submit your pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork) to the + repo's default branch (`main`). + +- **[Resolve any merge conflicts](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-on-github)** that + occur. + +- **Promptly address any CI failures**. If your pull request fails to build or pass tests, please push another commit to fix it. + +## Code Review + +- **Review the code, not the author.** Look for and suggest improvements without disparaging or insulting the author. Provide actionable feedback and explain + your reasoning. + +- **You are not your code.** When your code is critiqued, questioned, or constructively criticized, remember that you are not your code. Do not take code review + personally. + +- **Always do your best.** No one writes bugs on purpose. Do your best, and learn from your mistakes. + +- Kindly note any violations to the guidelines specified in this document. + +## Coding Style + +Consistency is the most important. Following the existing style, formatting, and naming conventions of the file you are modifying and of the overall project. +Failure to do so will result in a prolonged review process that has to focus on updating the superficial aspects of your code, rather than improving its +functionality and performance. Style and format will be enforced with a linter. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..261efa6 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2981 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.3.0", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-std" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "clap" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "colored" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.100", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "dary_heap" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04d2cd9c18b9f454ed67da600630b021a8a80bf33f8c95896ab33aaf1c26b728" + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", + "rayon", + "serde", +] + +[[package]] +name = "data-url" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" + +[[package]] +name = "default-test" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467f5a1dea34a7982be3657c25047a53439c03f060bcf474c8da4d9fb69dd5f0" + +[[package]] +name = "deployment-all" +version = "0.10.0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "destructure_traitobject" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.59.0", +] + +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand 2.3.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "humantime" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "include-flate" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df49c16750695486c1f34de05da5b7438096156466e7f76c38fcdf285cf0113e" +dependencies = [ + "include-flate-codegen", + "lazy_static", + "libflate", +] + +[[package]] +name = "include-flate-codegen" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c5b246c6261be723b85c61ecf87804e8ea4a35cb68be0ff282ed84b95ffe7d7" +dependencies = [ + "libflate", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "inotify" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +dependencies = [ + "bitflags 2.9.0", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "inventory" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab08d7cd2c5897f2c949e5383ea7c7db03fb19130ffcfbf7eda795137ae3cb83" +dependencies = [ + "rustversion", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "kqueue" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libflate" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45d9dfdc14ea4ef0900c1cddbc8dcd553fbaacd8a4a282cf4018ae9dd04fb21e" +dependencies = [ + "adler32", + "core2", + "crc32fast", + "dary_heap", + "libflate_lz77", +] + +[[package]] +name = "libflate_lz77" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e0d73b369f386f1c44abd9c570d5318f55ccde816ff4b562fa452e5182863d" +dependencies = [ + "core2", + "hashbrown 0.14.5", + "rle-decode-fast", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", + "redox_syscall", +] + +[[package]] +name = "license" +version = "3.6.0+3.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b517725daf998729e5ef4c4881cdde19cd5bbdde09741ba1b0f1ba0ce018961" +dependencies = [ + "reword", + "serde", + "serde_json", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +dependencies = [ + "serde", + "value-bag", +] + +[[package]] +name = "log-mdc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" + +[[package]] +name = "log4rs" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0816135ae15bd0391cf284eab37e6e3ee0a6ee63d2ceeb659862bd8d0a984ca6" +dependencies = [ + "anyhow", + "arc-swap", + "chrono", + "derivative", + "fnv", + "humantime", + "libc", + "log", + "log-mdc", + "once_cell", + "parking_lot", + "rand 0.8.5", + "serde", + "serde-value", + "serde_json", + "serde_yaml", + "thiserror 1.0.69", + "thread-id", + "toml", + "typemap-ors", + "winapi", +] + +[[package]] +name = "matchit" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f926ade0c4e170215ae43342bf13b9310a437609c81f29f86c5df6657582ef9" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "notify" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fee8403b3d66ac7b26aee6e40a897d85dc5ce26f44da36b8b73e987cc52e943" +dependencies = [ + "bitflags 2.9.0", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio", + "notify-types", + "walkdir", + "windows-sys 0.59.0", +] + +[[package]] +name = "notify-types" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" +dependencies = [ + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pest" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "pest_meta" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand 2.3.0", + "futures-io", +] + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.25", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc_macro2_helper" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79528bef70da112116feb5ecb6b64f1394e5360660d6474a760789ea07885501" +dependencies = [ + "proc-macro2", + "syn 2.0.100", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "rand_derive3" +version = "0.2.0" +source = "git+https://github.com/reactive-graph/rand_derive3.git?branch=rust-edition-2024#324f6bb2004c4fe9e85a581eef72bf33c83d00dc" +dependencies = [ + "proc-macro2", + "proc_macro2_helper", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "random-string" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f70fd13c3024ae3f17381bb5c4d409c6dc9ea6895c08fa2147aba305bea3c4af" +dependencies = [ + "fastrand 1.9.0", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "reactive-graph-behaviour-model-api" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "dashmap", + "reactive-graph-graph", + "reactive-graph-reactive-model-api", + "schemars", + "serde", + "serde_json", + "thiserror 2.0.12", + "typed-builder", +] + +[[package]] +name = "reactive-graph-behaviour-model-impl" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "dashmap", + "log", + "reactive-graph-behaviour-model-api", + "reactive-graph-graph", + "reactive-graph-reactive-model-api", + "reactive-graph-reactive-model-impl", + "serde", + "serde_json", + "strum", + "uuid", +] + +[[package]] +name = "reactive-graph-behaviour-service-api" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "async-trait", + "reactive-graph-behaviour-model-api", + "reactive-graph-graph", + "reactive-graph-lifecycle", + "reactive-graph-reactive-model-impl", + "reactive-graph-type-system-api", + "springtime-di", + "uuid", +] + +[[package]] +name = "reactive-graph-command-model" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "clap", + "lazy_static", + "reactive-graph-graph", + "reactive-graph-reactive-model-api", + "reactive-graph-reactive-model-impl", + "reactive-graph-runtime-model", + "serde", + "serde_json", + "strum_macros", + "typed-builder", + "uuid", +] + +[[package]] +name = "reactive-graph-config-model" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "num_cpus", + "reactive-graph-remotes-model", + "serde", +] + +[[package]] +name = "reactive-graph-graph" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "dashmap", + "default-test", + "rand 0.9.1", + "rand_derive3", + "reactive-graph-test-utils", + "schemars", + "serde", + "serde_json", + "thiserror 2.0.12", + "typed-builder", + "uuid", + "wildmatch", +] + +[[package]] +name = "reactive-graph-lifecycle" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "async-trait", +] + +[[package]] +name = "reactive-graph-model-base" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/std.git#7a975674a650b95dcf361caa8802862fbefa35e5" +dependencies = [ + "license", + "paste", + "reactive-graph-graph", + "semver", + "serde", + "serde_json", + "strum_macros", +] + +[[package]] +name = "reactive-graph-model-value" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/std.git#7a975674a650b95dcf361caa8802862fbefa35e5" +dependencies = [ + "dashmap", + "paste", + "reactive-graph-graph", + "reactive-graph-reactive-model-api", + "reactive-graph-reactive-model-impl", + "reactive-graph-reactive-service-api", + "serde", + "serde_json", + "strum_macros", + "uuid", +] + +[[package]] +name = "reactive-graph-plugin-api" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "async-trait", + "http", + "reactive-graph-behaviour-model-api", + "reactive-graph-command-model", + "reactive-graph-config-model", + "reactive-graph-graph", + "reactive-graph-plugin-derive", + "reactive-graph-reactive-model-impl", + "reactive-graph-reactive-service-api", + "reactive-graph-type-system-api", + "rust-embed", + "rustc_version", + "serde", + "serde_json", + "springtime-di", + "thiserror 2.0.12", + "tokio-stream", + "uuid", +] + +[[package]] +name = "reactive-graph-plugin-derive" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" + +[[package]] +name = "reactive-graph-reactive-derive" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "reactive-graph-reactive-model-api" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "reactive-graph-graph", + "serde_json", + "thiserror 2.0.12", + "uuid", +] + +[[package]] +name = "reactive-graph-reactive-model-impl" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "dashmap", + "reactive-graph-behaviour-model-api", + "reactive-graph-graph", + "reactive-graph-reactive-model-api", + "serde", + "serde_json", + "typed-builder", + "uuid", +] + +[[package]] +name = "reactive-graph-reactive-service-api" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "async-trait", + "crossbeam", + "dashmap", + "reactive-graph-behaviour-model-api", + "reactive-graph-behaviour-service-api", + "reactive-graph-graph", + "reactive-graph-lifecycle", + "reactive-graph-reactive-derive", + "reactive-graph-reactive-model-api", + "reactive-graph-reactive-model-impl", + "reactive-graph-type-system-api", + "rustversion", + "serde", + "serde_json", + "springtime-di", + "thiserror 2.0.12", + "uuid", +] + +[[package]] +name = "reactive-graph-remotes-model" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "chrono", + "serde", + "typed-builder", +] + +[[package]] +name = "reactive-graph-runtime-model" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "reactive-graph-graph", + "serde", + "serde_json", + "strum_macros", +] + +[[package]] +name = "reactive-graph-serde" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "json5", + "serde_json", + "thiserror 2.0.12", + "toml", +] + +[[package]] +name = "reactive-graph-sys-binary" +version = "0.10.0" +dependencies = [ + "async-trait", + "base64", + "http", + "infer", + "log", + "log4rs", + "matchit", + "mime_guess", + "reactive-graph-behaviour-model-api", + "reactive-graph-behaviour-model-impl", + "reactive-graph-graph", + "reactive-graph-plugin-api", + "reactive-graph-reactive-model-api", + "reactive-graph-reactive-model-impl", + "reactive-graph-runtime-model", + "reactive-graph-sys-binary-model", + "reactive-graph-sys-file-model", + "reactive-graph-type-system-api", + "rust-embed", + "serde", + "serde_json", + "shellexpand", + "springtime-di", + "strum", + "strum_macros", + "uuid", +] + +[[package]] +name = "reactive-graph-sys-binary-model" +version = "0.10.0" +dependencies = [ + "data-url", + "lazy_static", + "paste", + "reactive-graph-behaviour-model-api", + "reactive-graph-graph", + "reactive-graph-model-base", + "reactive-graph-reactive-model-api", + "reactive-graph-reactive-model-impl", + "reactive-graph-runtime-model", + "reactive-graph-sys-file-model", + "serde", + "serde_json", + "strum_macros", +] + +[[package]] +name = "reactive-graph-sys-file" +version = "0.10.0" +dependencies = [ + "async-std", + "async-trait", + "crossbeam", + "log", + "log4rs", + "notify", + "reactive-graph-behaviour-model-api", + "reactive-graph-behaviour-model-impl", + "reactive-graph-graph", + "reactive-graph-plugin-api", + "reactive-graph-reactive-model-api", + "reactive-graph-reactive-model-impl", + "reactive-graph-runtime-model", + "reactive-graph-sys-file-model", + "reactive-graph-type-system-api", + "rust-embed", + "serde", + "serde_json", + "shellexpand", + "springtime-di", + "uuid", +] + +[[package]] +name = "reactive-graph-sys-file-model" +version = "0.10.0" +dependencies = [ + "lazy_static", + "paste", + "reactive-graph-behaviour-model-api", + "reactive-graph-graph", + "reactive-graph-reactive-model-api", + "reactive-graph-reactive-model-impl", + "reactive-graph-runtime-model", + "serde", + "serde_json", + "strum_macros", +] + +[[package]] +name = "reactive-graph-sys-system-environment" +version = "0.10.0" +dependencies = [ + "async-trait", + "log", + "log4rs", + "reactive-graph-graph", + "reactive-graph-model-base", + "reactive-graph-model-value", + "reactive-graph-plugin-api", + "reactive-graph-reactive-model-impl", + "reactive-graph-reactive-service-api", + "reactive-graph-runtime-model", + "reactive-graph-sys-system-environment-model", + "reactive-graph-type-system-api", + "rust-embed", + "serde_json", + "springtime-di", + "thiserror 2.0.12", + "uuid", +] + +[[package]] +name = "reactive-graph-sys-system-environment-model" +version = "0.10.0" +dependencies = [ + "reactive-graph-graph", + "reactive-graph-reactive-model-api", + "reactive-graph-reactive-model-impl", + "serde_json", + "uuid", +] + +[[package]] +name = "reactive-graph-test-utils" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "colored", + "log", + "log4rs", + "random-string", + "serde_json", +] + +[[package]] +name = "reactive-graph-type-system-api" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "async-trait", + "json5", + "reactive-graph-graph", + "reactive-graph-lifecycle", + "reactive-graph-reactive-model-impl", + "reactive-graph-serde", + "reactive-graph-type-system-derive", + "rust-embed", + "serde_json", + "springtime-di", + "thiserror 2.0.12", + "toml", + "uuid", +] + +[[package]] +name = "reactive-graph-type-system-derive" +version = "0.10.0" +source = "git+https://github.com/reactive-graph/reactive-graph.git#84458193b243ce007c0be495abfcd684fd27dc09" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "redox_syscall" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "redox_users" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.12", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "reword" +version = "7.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2de73ec80cfacafa51b73b0db31d6c3a4718fc6b0d479ef445609704020c1b0" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "rle-decode-fast" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" + +[[package]] +name = "rust-embed" +version = "8.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5fbc0ee50fcb99af7cebb442e5df7b5b45e9460ffa3f8f549cd26b862bec49d" +dependencies = [ + "include-flate", + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bf418c9a2e3f6663ca38b8a7134cc2c2167c9d69688860e8961e3faa731702e" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn 2.0.100", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d55b95147fe01265d06b3955db798bdaed52e60e2211c41137701b3aba8e21" +dependencies = [ + "sha2", + "walkdir", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "1.0.0-alpha.17" +source = "git+https://github.com/GREsau/schemars.git#524e5906546a16a73d1b602fcdd3dcf0744afb87" +dependencies = [ + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", + "uuid", +] + +[[package]] +name = "schemars_derive" +version = "1.0.0-alpha.17" +source = "git+https://github.com/GREsau/schemars.git#524e5906546a16a73d1b602fcdd3dcf0744afb87" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.100", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shellexpand" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" +dependencies = [ + "dirs", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "springtime-di" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9582704b4b93e6e8a1a5ecd3519d5a739f83c7cffd726965df70de84535a9dd1" +dependencies = [ + "derivative", + "fxhash", + "inventory", + "itertools", + "springtime-di-derive", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "springtime-di-derive" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f462fdabd80f39cf710a3db1f2c66417fb78d30bebb78fd3b32111e495be82" +dependencies = [ + "convert_case", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.100", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "thread-id" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe8f25bbdd100db7e1d34acf7fd2dc59c4bf8f7483f505eaa7d4f12f76cc0ea" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "tokio" +version = "1.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +dependencies = [ + "backtrace", + "pin-project-lite", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900f6c86a685850b1bc9f6223b20125115ee3f31e01207d81655bbcc0aea9231" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10558ed0bd2a1562e630926a2d1f0b98c827da99fabd3fe20920a59642504485" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28391a4201ba7eb1984cfeb6862c0b3ea2cfe23332298967c749dddc0d6cd976" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typed-builder" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd9d30e3a08026c78f246b173243cf07b3696d274debd26680773b6773c2afc7" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c36781cc0e46a83726d9879608e4cf6c2505237e263a8eb8c24502989cfdb28" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "typemap-ors" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68c24b707f02dd18f1e4ccceb9d49f2058c2fb86384ef9972592904d7a28867" +dependencies = [ + "unsafe-any-ors", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unsafe-any-ors" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a303d30665362d9680d7d91d78b23f5f899504d4f08b3c4cf08d055d87c0ad" +dependencies = [ + "destructure_traitobject", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +dependencies = [ + "getrandom 0.3.2", + "serde", + "sha1_smol", +] + +[[package]] +name = "value-bag" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wildmatch" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ce1ab1f8c62655ebe1350f589c61e505cf94d385bc6a12899442d9081e71fd" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive 0.8.25", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..5e40cda --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,75 @@ +[workspace] + +members = [ + "plugins/binary/crates/model", + "plugins/binary/crates/plugin", + "plugins/file/crates/model", + "plugins/file/crates/plugin", + "plugins/system-environment/crates/model", + "plugins/system-environment/crates/plugin", + "deployment" +] +resolver = "3" + +[workspace.package] +version = "0.10.0" +authors = ["Andreas Schaeffer "] +edition = "2024" +license = "MIT" +repository = "https://github.com/reactive-graph/sys" +homepage = "https://www.reactive-graph.io/" +keywords = ["graph", "reactive", "control-flow", "inexor"] +rust-version = "1.85.0" + +[workspace.dependencies] +async-std = "1.12" +async-trait = "0.1" +base64 = "0.22" +crossbeam = "0.8" +data-url = "0.3" +http = "0.2" +infer = "0.19" +lazy_static = "1.4" +log = { version = "0.4", features = ["std", "serde"] } +log4rs = { version = "1.2", features = ["console_appender", "file_appender", "toml_format"] } +matchit = "0.8" +mime_guess = "2.0" +notify = { version = "8.0", features = ["serde", "crossbeam-channel"] } +paste = "1.0" +rust-embed = { version = "8.0", features = ["debug-embed", "compression"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +springtime = "1.0" +springtime-di = { version = "1.0", default-features = false, features = ["threadsafe", "derive"] } +shellexpand = "3.0" +strum = { version = "0.27", features = ["derive"] } +strum_macros = "0.27" +thiserror = "2.0" +toml = "0.8" +uuid = { version = "1.2", features = ["serde", "v4", "v5"] } + +### Prefer git to crates.io for development + +reactive-graph-behaviour-model-api = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-behaviour-model-impl = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-behaviour-service-api = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-config-model = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-graph = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-runtime-model = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-plugin-api = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-plugin-derive = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-reactive-model-api = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-reactive-model-impl = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-reactive-service-api = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git", features = ["derive"] } +reactive-graph-reactive-service-impl = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-type-system-api = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git", features = ["json5", "toml"] } +reactive-graph-lifecycle = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } +reactive-graph-test-utils = { version = "0.10.0", git = "https://github.com/reactive-graph/reactive-graph.git" } + +[profile.dev] +opt-level = 0 + +[profile.release] +opt-level = 3 +lto = true +strip = "symbols" diff --git a/LICENSE b/LICENSE.md similarity index 89% rename from LICENSE rename to LICENSE.md index 27b5c9b..89da3fb 100644 --- a/LICENSE +++ b/LICENSE.md @@ -1,6 +1,6 @@ -MIT License +# MIT License -Copyright (c) 2025 Reactive Graph +Copyright (c) 2011-2024 Andreas Schaeffer, the Reactive Graph Contributors and the Inexor Collective. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index f269c92..d4d4c9c 100644 --- a/README.md +++ b/README.md @@ -1 +1,66 @@ -# sys \ No newline at end of file +
+ Reactive Graph +
+ +

+ sys.reactive-graph.io +

+ +

+This repository contains the standard library for the Reactive Graph. +

+ +

+ Reactive Graph is a reactive runtime based on a graph database, empowering everyone to build reliable and efficient software. +

+ +
+ +
+ +[](https://docs.reactive-graph.io/book/) +[](https://docs.reactive-graph.io/docs/) + +[](https://www.rust-lang.org/) +[]() +[](https://github.com/reactive-graph/sys/blob/main/LICENSE) + +[![Build](https://github.com/reactive-graph/sys/actions/workflows/rust.yml/badge.svg)](https://github.com/reactive-graph/sys/actions/workflows/rust.yml) +[](https://discord.com/invite/acUW8k7) + +
+ + +

List of Plugins

+ +In this repository you'll find the essential plugins which are necessary or useful for all use cases. + +| Name | Description | +|--------------------------------------------------------------|--------------------------------| +| [System Environment](./plugins/system-environment/README.md) | Provides environment variables | +| [File](./plugins/file/README.md) | File representation | +| [Binary](./plugins/binary/README.md) | Handles binary data | + +

Local Build + Local Deployment

+ +#### Setup deployment directory in `.deployment.toml` + +```shell +target_dirs = [ + "../reactive-graph/plugins/deploy" +] +``` + +#### Install a specific plugin + +```shell +cargo build +cargo post build --package=reactive-graph-plugin-date-time +``` + +#### Install all plugins of this repository at once + +```shell +cargo build +cargo post build --package=deployment-all +``` diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..56d8967 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,14 @@ +# Security Policy + +If you discover a security issue, please bring it to our attention right away! + +## Reporting a Vulnerability + +Please **DO NOT** file a public issue to report a security vulnerability, instead send your report privately to **info@reactive-graph.io**. This will help +ensure that any vulnerabilities that are found can be [disclosed responsibly](https://en.wikipedia.org/wiki/Responsible_disclosure) to any affected parties. + +## Supported Versions + +Project versions that are currently being supported with security updates vary per project. +Please see specific project repositories for details. +If nothing is specified, only the latest major versions are supported. diff --git a/codecov.yaml b/codecov.yaml new file mode 100644 index 0000000..3a38853 --- /dev/null +++ b/codecov.yaml @@ -0,0 +1,2 @@ +codecov: + disable_default_path_fixes: yes diff --git a/deployment/.run/Install All Plugins.run.xml b/deployment/.run/Install All Plugins.run.xml new file mode 100644 index 0000000..b3f213d --- /dev/null +++ b/deployment/.run/Install All Plugins.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/deployment/Cargo.toml b/deployment/Cargo.toml new file mode 100644 index 0000000..910904b --- /dev/null +++ b/deployment/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "deployment-all" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +publish = false + +[lib] +crate-type = ["lib"] + +[package.metadata.cargo-post.dependencies] +toml = "0.8" +serde = { version = "1.0", features = ["derive"] } +glob = "0.3" diff --git a/deployment/post_build.rs b/deployment/post_build.rs new file mode 100644 index 0000000..b17d205 --- /dev/null +++ b/deployment/post_build.rs @@ -0,0 +1,42 @@ +use serde::Deserialize; +use std::env; +use std::fs; +use std::path::PathBuf; + +#[derive(Deserialize)] +struct Deployment { + pub target_dirs: Vec, +} + +fn main() { + match fs::read_to_string("./.deployment.toml") { + Ok(toml_string) => { + let deployment: Result = toml::from_str(&toml_string); + match deployment { + Ok(deployment) => { + let mut crate_out_dir = env::var("CRATE_OUT_DIR").unwrap(); + crate_out_dir.push_str("/libreactive_graph_plugin_*.*"); + for target_dir in deployment.target_dirs { + for entry in glob::glob(crate_out_dir.as_str()).unwrap() { + if let Ok(source_path) = entry { + let file_name = source_path.file_name().unwrap().to_str().unwrap(); + if file_name.ends_with(".so") || file_name.ends_with(".dll") { + let mut target_path = PathBuf::from(&target_dir); + target_path.push(file_name); + println!("Copy plugin from {} to {}", source_path.display(), target_path.display()); + let _ = fs::copy(source_path, target_path); + } + } + } + } + } + Err(e) => { + eprintln!("Failed to parse .deployment.toml: {}", e); + } + } + } + Err(e) => { + eprintln!("Could not read .deployment.toml: {}", e); + } + } +} diff --git a/deployment/src/lib.rs b/deployment/src/lib.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/deployment/src/lib.rs @@ -0,0 +1 @@ + diff --git a/dynamic_graph/schema.graphql b/dynamic_graph/schema.graphql new file mode 100644 index 0000000..155b9bf --- /dev/null +++ b/dynamic_graph/schema.graphql @@ -0,0 +1,5597 @@ +# This file was generated based on ".graphqlconfig". Do not edit manually. + +schema { + query: Query + mutation: Mutation +} + +"Arithmetic operation with two inputs and one result" +interface Arithmetic_ArithmeticGate_Component { + _c__arithmetic__arithmetic_gate: ID + lhs: Float + result: Float + rhs: Float +} + +"Arithmetic operation with one input and one result" +interface Arithmetic_ArithmeticOperation_Component { + _c__arithmetic__arithmetic_operation: ID + lhs: Float + result: Float +} + +"The entity or relation has a description." +interface Base_Describable_Component { + _c__base__describable: ID + "The description of an entity or a relation" + description: String +} + +"The entity is licensed." +interface Base_Licensed_Component { + _c__base__licensed: ID + "Title, author, source and license. Best practices for attribution: https://wiki.creativecommons.org/wiki/best_practices_for_attribution" + attribution: String + "The SPDX license identifier. See: https://spdx.org/licenses/" + license: String +} + +"The entity or relation has a name." +interface Base_Named_Component { + _c__base__named: ID + "The name of an entity or a relation" + name: String +} + +"The relations between two entities are ordered using a ordinal number associated with sibling relations" +interface Base_Ordered_Component { + _c__base__ordered: ID + "The relation ordinal number associated with sibling relations" + order: Float +} + +"The entity is versioned." +interface Base_Versioned_Component { + _c__base__versioned: ID + "The version number. Use semantic versioning. See: https://semver.org/" + version: String +} + +interface Binary_BinaryData_Component { + _c__binary__binary_data: ID + data_url: String +} + +"Loads binary data" +interface Binary_LoadBinaryData_Component { + _c__binary__load_binary_data: ID + data_url: String +} + +"Saves binary data" +interface Binary_SaveBinaryData_Component { + _c__binary__save_binary_data: ID + data_url: String +} + +"The alpha component" +interface Color_Alpha_Component { + _c__color__alpha: ID + "Transparency component. 0.0 is fully transparent. 1.0 is fully opaque." + alpha: Float +} + +"The brightness component" +interface Color_Brightness_Component { + _c__color__brightness: ID + "Decides how bright the color will look. 0.0 will be black, and 1.0 will give a bright an clear color that goes towards white when saturation goes towards 0.0." + brightness: Float +} + +"The HS components" +interface Color_Hs_Component { + _c__color__hs: ID + "The hue of the color, in degrees. Decides if it’s red, blue, purple, etc." + hue: Float + "The colorfulness of the color. 0.0 gives gray scale colors and 1.0 will give absolutely clear colors." + saturation: Float +} + +"The lightness component" +interface Color_Lightness_Component { + _c__color__lightness: ID + "Decides how light the color will look. 0.0 will be black, 0.5 will give a clear color, and 1.0 will give white." + lightness: Float +} + +"The color in RGB color space." +interface Color_Rgb_Component { + _c__color__rgb: ID + "Blue" + blue: Float + "Green" + green: Float + "Red" + red: Float +} + +interface Comparison_ComparisonGate_Component { + _c__comparison__comparison_gate: ID + lhs: JSON + rhs: JSON +} + +interface Comparison_ComparisonNumeric_Component { + _c__comparison__comparison_numeric: ID + lhs: Float + rhs: Float +} + +"Loads a configuration file" +interface Config_ConfigFile_Component { + _c__config__config_file: ID + result: JSON +} + +"A buffer of the given size" +interface Connector_Buffer_Component { + _c__connector__buffer: ID + "The buffer with up to buffer_size elements" + buffer: JSON + "The number of elements of the buffer" + buffer_size: Float +} + +"Connects a property of an entity instance with a other property of another entity instance" +interface Connector_Connector_Component { + _c__connector__connector: ID + "The name of the inbound property" + inbound_property_name: String + "The name of the outbound property" + outbound_property_name: String +} + +"Counts the number of propagations" +interface Connector_PropagationCounter_Component { + _c__connector__propagation_counter: ID + "The count of propagations" + propagation_count: Float +} + +"This components spawns events." +interface Core_Event_Component { + _c__core__event: ID + event: JSON +} + +"The label is an hierarchical path with static segments, named parameters and catch-all parameters." +interface Core_Labeled_Component { + _c__core__labeled: ID + label: String +} + +"Entities have a outbound relations and a inbound relations as well as components and properties " +interface Entity { + id: ID! +} + +"Represents a file in the file system" +interface File_File_Component { + _c__file__file: ID + "The filename" + filename: String +} + +"Triggers if the file with the given filename has been changed" +interface File_FsNotify_Component { + _c__file__fs_notify: ID + "The filename" + filename: String + "Triggers if the file with the given filename has been changed" + trigger: Boolean +} + +"Git repository" +interface Git_Repository_Component { + _c__git__repository: ID + "The current branch name." + branch: String + "Fast forward" + fast_forward: Boolean + "Fetches the remotes" + fetch: Boolean + "Merges the given local branch into the current branch" + merge_from: String + "Pushes the current branch to the remote" + push: Boolean + "The branch of the remote repository." + remote_branch: String + "The name of the remote repository." + remote_name: String +} + +"The transfer progress" +interface Git_TransferProgress_Component { + _c__git__transfer_progress: ID + indexed_deltas: Float + indexed_objects: Float + local_objects: Float + received_bytes: Float + received_objects: Float + total_deltas: Float + total_objects: Float +} + +"Sends HTTP request to a given URL" +interface Http_Http_Component { + _c__http__http: ID +} + +"Sends JSON-RPC request to a given URL" +interface Http_JsonRpc_Component { + _c__http__json_rpc: ID + error: JSON + json_rpc_version: String + method: String + params: JSON + result: JSON +} + +"A HTTP request" +interface Http_Request_Component { + _c__http__request: ID + "The HTTP request method" + method: String + "The HTTP request payload" + payload: JSON + "The HTTP request headers" + request_headers: JSON +} + +"A HTTP response" +interface Http_Response_Component { + _c__http__response: ID + "The HTTP response headers" + response_headers: JSON + "The HTTP response status code" + status: Float +} + +"A Uniform Resource Locator (URL), colloquially termed as a web address, is a reference to a web resource that specifies its location on a computer network and a mechanism for retrieving it." +interface Http_Url_Component { + _c__http__url: ID + "Uniform Resource Locator" + url: String +} + +"Loads a JSON file" +interface Json_LoadJson_Component { + _c__json__load_json: ID +} + +"Saves an object as JSON file" +interface Json_SaveJson_Component { + _c__json__save_json: ID + payload: JSON +} + +"Depending on the given condition outputs a result" +interface Logical_Condition_Component { + _c__logical__condition: ID + "A boolean condition" + condition: Boolean + "The result" + result: JSON +} + +"Executes a logical operation on the inputs lhs and rhs and outputs the result" +interface Logical_LogicalGate_Component { + _c__logical__logical_gate: ID + lhs: Boolean + result: Boolean + rhs: Boolean +} + +"Executes a logical operation on the input lhs and outputs the result" +interface Logical_LogicalOperation_Component { + _c__logical__logical_operation: ID + lhs: Boolean + result: Boolean +} + +interface Metadata_DublinCore_Component { + _c__metadata__dublin_core: ID + "An entity responsible for making contributions to the resource." + dc_contributor: String + "The spatial or temporal topic of the resource, the spatial applicability of the resource, or the jurisdiction under which the resource is relevant" + dc_coverage: String + "An entity primarily responsible for making the resource" + dc_creator: String + "A point or period of time associated with an event in the lifecycle of the resource" + dc_date: String + "An account of the resource" + dc_description: String + "The file format, physical medium, or dimensions of the resource" + dc_format: String + "An unambiguous reference to the resource within a given context" + dc_identifier: String + "A language of the resource" + dc_language: String + "An entity responsible for making the resource available" + dc_publisher: String + "A related resource" + dc_relation: String + "Information about rights held in and over the resource" + dc_rights: String + "A related resource from which the described resource is derived" + dc_source: String + "The topic of the resource" + dc_subject: String + "A name given to the resource" + dc_title: String + "The nature or genre of the resource" + dc_type: String +} + +interface Metadata_Id3_Component { + _c__metadata__id3: ID + id3_talb: String +} + +interface Numeric_NumericGate_Component { + _c__numeric__numeric_gate: ID + lhs: Float + result: Float + rhs: Float +} + +interface Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + lhs: Float + result: Float +} + +"Pseudo Number Generator" +interface Random_PseudoNumberGenerator_Component { + _c__random__pseudo_number_generator: ID + seed: Float +} + +"Range" +interface Random_Range_Component { + _c__random__range: ID + high: Float + low: Float +} + +"Relations have a outbound entity and a inbound entity as well as components and properties," +interface Relation { + instance_id: ID! + key: ID! +} + +"The entity returns data of any datatype" +interface Result_ResultAny_Component { + _c__result__result_any: ID + "The result" + result: JSON +} + +"The entity returns an array" +interface Result_ResultArray_Component { + _c__result__result_array: ID + "The result" + result: JSON +} + +"The entity returns a boolean" +interface Result_ResultBoolean_Component { + _c__result__result_boolean: ID + "The result" + result: Boolean +} + +"The entity returns a number" +interface Result_ResultNumber_Component { + _c__result__result_number: ID + "The result" + result: Float +} + +"The entity returns an object" +interface Result_ResultObject_Component { + _c__result__result_object: ID + "The result" + result: JSON +} + +"The entity returns a string" +interface Result_ResultString_Component { + _c__result__result_string: ID + "The result" + result: String +} + +"State of type array" +interface State_StateArray_Component { + _c__state__state_array: ID + set_state: JSON + state: JSON +} + +"State of type boolean" +interface State_StateBoolean_Component { + _c__state__state_boolean: ID + set_state: Boolean + state: Boolean +} + +interface State_StateDebuggerDebug_Component { + _c__state__state_debugger_debug: ID +} + +interface State_StateDebuggerTrace_Component { + _c__state__state_debugger_trace: ID +} + +"State of type number" +interface State_StateNumber_Component { + _c__state__state_number: ID + set_state: Float + state: Float +} + +"State of type object" +interface State_StateObject_Component { + _c__state__state_object: ID + set_state: JSON + state: JSON +} + +"State of type string" +interface State_StateString_Component { + _c__state__state_string: ID + set_state: String + state: String +} + +interface String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + lhs: String + result: Boolean +} + +interface String_StringComparison_Component { + _c__string__string_comparison: ID + lhs: String + result: Boolean + rhs: String +} + +interface String_StringGate_Component { + _c__string__string_gate: ID + lhs: String + result: String + rhs: String +} + +interface String_StringNumberOperation_Component { + _c__string__string_number_operation: ID + lhs: String + result: Float +} + +interface String_StringOperation_Component { + _c__string__string_operation: ID + lhs: String + result: String +} + +interface String_StringStringNumberGate_Component { + _c__string__string_string_number_gate: ID + lhs: String + result: Float + rhs: String +} + +interface Taxonomy_Weighted_Component { + _c__taxonomy__weighted: ID + weight: Float +} + +"An action can be triggered" +interface Trigger_Action_Component { + _c__trigger__action: ID + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +"A generator sends a trigger" +interface Trigger_Generator_Component { + _c__trigger__generator: ID + "Sends a boolean trigger" + trigger: Boolean +} + +"Value of type array" +interface Value_ValueArray_Component { + _c__value__value_array: ID + value: JSON +} + +"Value of type boolean" +interface Value_ValueBoolean_Component { + _c__value__value_boolean: ID + value: Boolean +} + +interface Value_ValueDebuggerDebug_Component { + _c__value__value_debugger_debug: ID +} + +interface Value_ValueDebuggerTrace_Component { + _c__value__value_debugger_trace: ID +} + +"Value of type number" +interface Value_ValueNumber_Component { + _c__value__value_number: ID + value: Float +} + +"Value of type object" +interface Value_ValueObject_Component { + _c__value__value_object: ID + value: JSON +} + +"Value of type string" +interface Value_ValueString_Component { + _c__value__value_string: ID + value: String +} + +"Any entity." +union AllEntities = ArithmeticF64_Add_Entity | ArithmeticF64_Decrement_Entity | ArithmeticF64_Div_Entity | ArithmeticF64_Increment_Entity | ArithmeticF64_Max_Entity | ArithmeticF64_Min_Entity | ArithmeticF64_Mod_Entity | ArithmeticF64_Mul_Entity | ArithmeticF64_Sub_Entity | ArithmeticI64_Add_Entity | ArithmeticI64_Decrement_Entity | ArithmeticI64_Div_Entity | ArithmeticI64_Increment_Entity | ArithmeticI64_Max_Entity | ArithmeticI64_Min_Entity | ArithmeticI64_Mod_Entity | ArithmeticI64_Mul_Entity | ArithmeticI64_Sub_Entity | ArithmeticU64_Add_Entity | ArithmeticU64_Counter_Entity | ArithmeticU64_Decrement_Entity | ArithmeticU64_Div_Entity | ArithmeticU64_Increment_Entity | ArithmeticU64_Max_Entity | ArithmeticU64_Min_Entity | ArithmeticU64_Mod_Entity | ArithmeticU64_Mul_Entity | ArithmeticU64_Sub_Entity | Base_Comment_Entity | Binary_LoadBinaryData_Entity | Binary_SaveBinaryData_Entity | Color_Hsl_Entity | Color_HsvToRgb_Entity | Color_Hsv_Entity | Color_RgbToHsv_Entity | Color_Rgb_Entity | Color_Rgba_Entity | Comparison_Equals_Entity | Comparison_GreaterThanOrEquals_Entity | Comparison_GreaterThan_Entity | Comparison_LowerThanOrEquals_Entity | Comparison_LowerThan_Entity | Comparison_NotEquals_Entity | Config_ConfigFile_Entity | Core_Shutdown_Entity | Core_SystemEvent_Entity | DateTime_Day_Entity | DateTime_Hour_Entity | DateTime_Minute_Entity | DateTime_Month_Entity | DateTime_UtcNow_Entity | DateTime_UtcTimestamp_Entity | DateTime_Year_Entity | Flow_Comment_Entity | Flow_GenericFlow_Entity | Git_Repository_Entity | Http_Http_Entity | Http_JsonRpc_Entity | Json_ArrayContains_Entity | Json_ArrayGetByIndex_Entity | Json_ArrayLength_Entity | Json_ArrayPop_Entity | Json_ArrayPush_Entity | Json_ArrayReverse_Entity | Json_LoadJson_Entity | Json_ObjectGetProperty_Entity | Json_ObjectKeys_Entity | Json_ObjectRemoveProperty_Entity | Json_ObjectSetProperty_Entity | Json_SaveJson_Entity | Logical_And3_Entity | Logical_And_Entity | Logical_IfThenElse_Entity | Logical_Nand_Entity | Logical_Nor_Entity | Logical_Not_Entity | Logical_Or_Entity | Logical_Toggle_Entity | Logical_Trigger_Entity | Logical_Xnor_Entity | Logical_Xor_Entity | NumericF64_Abs_Entity | NumericF64_Acos_Entity | NumericF64_Acosh_Entity | NumericF64_Asin_Entity | NumericF64_Asinh_Entity | NumericF64_Atan2_Entity | NumericF64_Atan_Entity | NumericF64_Atanh_Entity | NumericF64_Cbrt_Entity | NumericF64_Ceil_Entity | NumericF64_Cos_Entity | NumericF64_Cosh_Entity | NumericF64_Exp2_Entity | NumericF64_Exp_Entity | NumericF64_Floor_Entity | NumericF64_Fract_Entity | NumericF64_Hypot_Entity | NumericF64_Ln_Entity | NumericF64_Log10_Entity | NumericF64_Log2_Entity | NumericF64_Log_Entity | NumericF64_Pow_Entity | NumericF64_Recip_Entity | NumericF64_Round_Entity | NumericF64_Signum_Entity | NumericF64_Sin_Entity | NumericF64_Sinh_Entity | NumericF64_Sqrt_Entity | NumericF64_Tan_Entity | NumericF64_Tanh_Entity | NumericF64_ToDegrees_Entity | NumericF64_ToRadians_Entity | NumericF64_Trunc_Entity | NumericI64_Abs_Entity | NumericI64_Signum_Entity | Random_RandomBool_Entity | Random_RandomF64Pseudo_Entity | Random_RandomF64Range_Entity | Random_RandomF64_Entity | Random_RandomI64Pseudo_Entity | Random_RandomI64Range_Entity | Random_RandomI64_Entity | Random_RandomString_Entity | Random_RandomU64Pseudo_Entity | Random_RandomU64Range_Entity | Random_RandomU64_Entity | Random_RandomUuid_Entity | State_StateArray_Entity | State_StateBoolean_Entity | State_StateNumber_Entity | State_StateObject_Entity | State_StateString_Entity | String_CamelCase_Entity | String_Capitalize_Entity | String_CharCountGraphemes_Entity | String_CharCount_Entity | String_ChopAfterLast_Entity | String_ChopAfter_Entity | String_ChopBeforeLast_Entity | String_ChopBefore_Entity | String_ChopRemovePrefix_Entity | String_ChopRemoveSuffix_Entity | String_Concat_Entity | String_Contains_Entity | String_CountSubstrings_Entity | String_CountUniqueWords_Entity | String_CountWords_Entity | String_Decapitalize_Entity | String_EndsWith_Entity | String_EscapeHtml_Entity | String_EscapeRegexp_Entity | String_IsAlphaDigit_Entity | String_IsAlpha_Entity | String_IsBlank_Entity | String_IsCamelCase_Entity | String_IsCapitalize_Entity | String_IsDecapitalize_Entity | String_IsDigit_Entity | String_IsEmpty_Entity | String_IsKebabCase_Entity | String_IsLowerFirst_Entity | String_IsLowercase_Entity | String_IsNumeric_Entity | String_IsPascalCase_Entity | String_IsShoutyKebabCase_Entity | String_IsShoutySnakeCase_Entity | String_IsSnakeCase_Entity | String_IsTitleCase_Entity | String_IsTrainCase_Entity | String_IsUpperFirst_Entity | String_IsUppercase_Entity | String_KebabCase_Entity | String_LowerFirst_Entity | String_Lowercase_Entity | String_PascalCase_Entity | String_Reverse_Entity | String_ShoutyKebabCase_Entity | String_ShoutySnakeCase_Entity | String_SnakeCase_Entity | String_StartsWith_Entity | String_StringLength_Entity | String_StripHtmlTags_Entity | String_SwapCase_Entity | String_Templating_Entity | String_TitleCase_Entity | String_TrainCase_Entity | String_TrimEnd_Entity | String_TrimStart_Entity | String_Trim_Entity | String_UnescapeHtml_Entity | String_UpperFirst_Entity | String_Uppercase_Entity | System_SystemEnv_Entity | Taxonomy_Category_Entity | Taxonomy_Tag_Entity | Value_ValueArray_Entity | Value_ValueBoolean_Entity | Value_ValueNumber_Entity | Value_ValueObject_Entity | Value_ValueString_Entity + +"Mutations for entities and relations on the namespace ArithmeticF64" +type ArithmeticF64Mutations { + "Adds two floating point numbers" + add(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticF64_Add_Entity_Mutations! + createAdd(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticF64_Add_Entity! + createDecrement(id: ID, lhs: Float!, result: Float): ArithmeticF64_Decrement_Entity! + createDiv(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticF64_Div_Entity! + createIncrement(id: ID, lhs: Float!, result: Float): ArithmeticF64_Increment_Entity! + createMax(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticF64_Max_Entity! + createMin(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticF64_Min_Entity! + createMod(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticF64_Mod_Entity! + createMul(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticF64_Mul_Entity! + createSub(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticF64_Sub_Entity! + "Decrements a number" + decrement(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): ArithmeticF64_Decrement_Entity_Mutations! + "Divides two floating point numbers" + div(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticF64_Div_Entity_Mutations! + "Increments a number" + increment(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): ArithmeticF64_Increment_Entity_Mutations! + "Returns the maximum value of two inputs" + max(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticF64_Max_Entity_Mutations! + "Returns the minimum value of two inputs" + min(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticF64_Min_Entity_Mutations! + "Modulo" + mod(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticF64_Mod_Entity_Mutations! + "Multiply two floating point numbers" + mul(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticF64_Mul_Entity_Mutations! + "Subtract an floating point number from another floating point number" + sub(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticF64_Sub_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace ArithmeticF64" +type ArithmeticF64Namespace { + "Adds two floating point numbers" + add(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticF64_Add_Entity!]! + "Decrements a number" + decrement(id: String, label: String, lhs: Float, result: Float): [ArithmeticF64_Decrement_Entity!]! + "Divides two floating point numbers" + div(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticF64_Div_Entity!]! + "Increments a number" + increment(id: String, label: String, lhs: Float, result: Float): [ArithmeticF64_Increment_Entity!]! + "Returns the maximum value of two inputs" + max(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticF64_Max_Entity!]! + "Returns the minimum value of two inputs" + min(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticF64_Min_Entity!]! + "Modulo" + mod(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticF64_Mod_Entity!]! + "Multiply two floating point numbers" + mul(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticF64_Mul_Entity!]! + "Subtract an floating point number from another floating point number" + sub(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticF64_Sub_Entity!]! +} + +"Adds two floating point numbers" +type ArithmeticF64_Add_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticF64_Add_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticF64_Add_Entity!]! +} + +"Decrements a number" +type ArithmeticF64_Decrement_Entity implements Arithmetic_ArithmeticOperation_Component & Entity { + _c__arithmetic__arithmetic_operation: ID + id: ID! + lhs: Float + result: Float +} + +type ArithmeticF64_Decrement_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [ArithmeticF64_Decrement_Entity!]! +} + +"Divides two floating point numbers" +type ArithmeticF64_Div_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticF64_Div_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticF64_Div_Entity!]! +} + +"Increments a number" +type ArithmeticF64_Increment_Entity implements Arithmetic_ArithmeticOperation_Component & Entity { + _c__arithmetic__arithmetic_operation: ID + id: ID! + lhs: Float + result: Float +} + +type ArithmeticF64_Increment_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [ArithmeticF64_Increment_Entity!]! +} + +"Returns the maximum value of two inputs" +type ArithmeticF64_Max_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticF64_Max_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticF64_Max_Entity!]! +} + +"Returns the minimum value of two inputs" +type ArithmeticF64_Min_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticF64_Min_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticF64_Min_Entity!]! +} + +"Modulo" +type ArithmeticF64_Mod_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticF64_Mod_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticF64_Mod_Entity!]! +} + +"Multiply two floating point numbers" +type ArithmeticF64_Mul_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticF64_Mul_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticF64_Mul_Entity!]! +} + +"Subtract an floating point number from another floating point number" +type ArithmeticF64_Sub_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticF64_Sub_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticF64_Sub_Entity!]! +} + +"Mutations for entities and relations on the namespace ArithmeticI64" +type ArithmeticI64Mutations { + "Adds two signed integer numbers" + add(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticI64_Add_Entity_Mutations! + createAdd(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticI64_Add_Entity! + createDecrement(id: ID, lhs: Float!, result: Float): ArithmeticI64_Decrement_Entity! + createDiv(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticI64_Div_Entity! + createIncrement(id: ID, lhs: Float!, result: Float): ArithmeticI64_Increment_Entity! + createMax(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticI64_Max_Entity! + createMin(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticI64_Min_Entity! + createMod(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticI64_Mod_Entity! + createMul(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticI64_Mul_Entity! + createSub(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticI64_Sub_Entity! + "Decrements a signed integer number" + decrement(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): ArithmeticI64_Decrement_Entity_Mutations! + "Divides two signed integer numbers" + div(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticI64_Div_Entity_Mutations! + "Increments a signed integer number" + increment(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): ArithmeticI64_Increment_Entity_Mutations! + "Returns the maximum value of two signed integer numbers" + max(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticI64_Max_Entity_Mutations! + "Returns the minimum value of two signed integer numbers" + min(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticI64_Min_Entity_Mutations! + "Modulo" + mod(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticI64_Mod_Entity_Mutations! + "Multiply two signed integer numbers" + mul(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticI64_Mul_Entity_Mutations! + "Subtract an signed integer number from another signed integer number" + sub(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticI64_Sub_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace ArithmeticI64" +type ArithmeticI64Namespace { + "Adds two signed integer numbers" + add(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticI64_Add_Entity!]! + "Decrements a signed integer number" + decrement(id: String, label: String, lhs: Float, result: Float): [ArithmeticI64_Decrement_Entity!]! + "Divides two signed integer numbers" + div(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticI64_Div_Entity!]! + "Increments a signed integer number" + increment(id: String, label: String, lhs: Float, result: Float): [ArithmeticI64_Increment_Entity!]! + "Returns the maximum value of two signed integer numbers" + max(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticI64_Max_Entity!]! + "Returns the minimum value of two signed integer numbers" + min(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticI64_Min_Entity!]! + "Modulo" + mod(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticI64_Mod_Entity!]! + "Multiply two signed integer numbers" + mul(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticI64_Mul_Entity!]! + "Subtract an signed integer number from another signed integer number" + sub(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticI64_Sub_Entity!]! +} + +"Adds two signed integer numbers" +type ArithmeticI64_Add_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticI64_Add_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticI64_Add_Entity!]! +} + +"Decrements a signed integer number" +type ArithmeticI64_Decrement_Entity implements Arithmetic_ArithmeticOperation_Component & Entity { + _c__arithmetic__arithmetic_operation: ID + id: ID! + lhs: Float + result: Float +} + +type ArithmeticI64_Decrement_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [ArithmeticI64_Decrement_Entity!]! +} + +"Divides two signed integer numbers" +type ArithmeticI64_Div_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticI64_Div_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticI64_Div_Entity!]! +} + +"Increments a signed integer number" +type ArithmeticI64_Increment_Entity implements Arithmetic_ArithmeticOperation_Component & Entity { + _c__arithmetic__arithmetic_operation: ID + id: ID! + lhs: Float + result: Float +} + +type ArithmeticI64_Increment_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [ArithmeticI64_Increment_Entity!]! +} + +"Returns the maximum value of two signed integer numbers" +type ArithmeticI64_Max_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticI64_Max_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticI64_Max_Entity!]! +} + +"Returns the minimum value of two signed integer numbers" +type ArithmeticI64_Min_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticI64_Min_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticI64_Min_Entity!]! +} + +"Modulo" +type ArithmeticI64_Mod_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticI64_Mod_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticI64_Mod_Entity!]! +} + +"Multiply two signed integer numbers" +type ArithmeticI64_Mul_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticI64_Mul_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticI64_Mul_Entity!]! +} + +"Subtract an signed integer number from another signed integer number" +type ArithmeticI64_Sub_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticI64_Sub_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticI64_Sub_Entity!]! +} + +"Queries for components, entities and relations on the namespace Arithmetic" +type ArithmeticNamespace { + "Arithmetic operation with two inputs and one result" + arithmeticGateComponent: [Arithmetic_ArithmeticGate_Component!]! + "Arithmetic operation with one input and one result" + arithmeticOperationComponent: [Arithmetic_ArithmeticOperation_Component!]! +} + +"Mutations for entities and relations on the namespace ArithmeticU64" +type ArithmeticU64Mutations { + "Adds two unsigned integer numbers" + add(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticU64_Add_Entity_Mutations! + "If triggered the counter will be increased" + counter(id: ID, ids: [ID!], label: String, result: Float, trigger: Boolean): ArithmeticU64_Counter_Entity_Mutations! + createAdd(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticU64_Add_Entity! + createCounter(id: ID, result: Float, trigger: Boolean!): ArithmeticU64_Counter_Entity! + createDecrement(id: ID, lhs: Float!, result: Float): ArithmeticU64_Decrement_Entity! + createDiv(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticU64_Div_Entity! + createIncrement(id: ID, lhs: Float!, result: Float): ArithmeticU64_Increment_Entity! + createMax(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticU64_Max_Entity! + createMin(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticU64_Min_Entity! + createMod(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticU64_Mod_Entity! + createMul(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticU64_Mul_Entity! + createSub(id: ID, lhs: Float!, result: Float, rhs: Float!): ArithmeticU64_Sub_Entity! + "Decrements a unsigned integer number" + decrement(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): ArithmeticU64_Decrement_Entity_Mutations! + "Divides two unsigned integer numbers" + div(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticU64_Div_Entity_Mutations! + "Increments a unsigned integer number" + increment(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): ArithmeticU64_Increment_Entity_Mutations! + "Returns the maximum value of two unsigned integer numbers" + max(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticU64_Max_Entity_Mutations! + "Returns the minimum value of two unsigned integer numbers" + min(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticU64_Min_Entity_Mutations! + "Modulo" + mod(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticU64_Mod_Entity_Mutations! + "Multiply two unsigned integer numbers" + mul(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticU64_Mul_Entity_Mutations! + "Subtract an unsigned integer number from another unsigned integer number" + sub(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): ArithmeticU64_Sub_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace ArithmeticU64" +type ArithmeticU64Namespace { + "Adds two unsigned integer numbers" + add(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticU64_Add_Entity!]! + "If triggered the counter will be increased" + counter(id: String, label: String, result: Float, trigger: Boolean): [ArithmeticU64_Counter_Entity!]! + "Decrements a unsigned integer number" + decrement(id: String, label: String, lhs: Float, result: Float): [ArithmeticU64_Decrement_Entity!]! + "Divides two unsigned integer numbers" + div(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticU64_Div_Entity!]! + "Increments a unsigned integer number" + increment(id: String, label: String, lhs: Float, result: Float): [ArithmeticU64_Increment_Entity!]! + "Returns the maximum value of two unsigned integer numbers" + max(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticU64_Max_Entity!]! + "Returns the minimum value of two unsigned integer numbers" + min(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticU64_Min_Entity!]! + "Modulo" + mod(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticU64_Mod_Entity!]! + "Multiply two unsigned integer numbers" + mul(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticU64_Mul_Entity!]! + "Subtract an unsigned integer number from another unsigned integer number" + sub(id: String, label: String, lhs: Float, result: Float, rhs: Float): [ArithmeticU64_Sub_Entity!]! +} + +"Adds two unsigned integer numbers" +type ArithmeticU64_Add_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticU64_Add_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticU64_Add_Entity!]! +} + +"If triggered the counter will be increased" +type ArithmeticU64_Counter_Entity implements Entity & Result_ResultNumber_Component & Trigger_Action_Component { + _c__result__result_number: ID + _c__trigger__action: ID + id: ID! + "The result" + result: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type ArithmeticU64_Counter_Entity_Mutations { + delete: [ID!]! + trigger: [ArithmeticU64_Counter_Entity!]! + update(trigger: Boolean): [ArithmeticU64_Counter_Entity!]! +} + +"Decrements a unsigned integer number" +type ArithmeticU64_Decrement_Entity implements Arithmetic_ArithmeticOperation_Component & Entity { + _c__arithmetic__arithmetic_operation: ID + id: ID! + lhs: Float + result: Float +} + +type ArithmeticU64_Decrement_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [ArithmeticU64_Decrement_Entity!]! +} + +"Divides two unsigned integer numbers" +type ArithmeticU64_Div_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticU64_Div_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticU64_Div_Entity!]! +} + +"Increments a unsigned integer number" +type ArithmeticU64_Increment_Entity implements Arithmetic_ArithmeticOperation_Component & Entity { + _c__arithmetic__arithmetic_operation: ID + id: ID! + lhs: Float + result: Float +} + +type ArithmeticU64_Increment_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [ArithmeticU64_Increment_Entity!]! +} + +"Returns the maximum value of two unsigned integer numbers" +type ArithmeticU64_Max_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticU64_Max_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticU64_Max_Entity!]! +} + +"Returns the minimum value of two unsigned integer numbers" +type ArithmeticU64_Min_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticU64_Min_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticU64_Min_Entity!]! +} + +"Modulo" +type ArithmeticU64_Mod_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticU64_Mod_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticU64_Mod_Entity!]! +} + +"Multiply two unsigned integer numbers" +type ArithmeticU64_Mul_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticU64_Mul_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticU64_Mul_Entity!]! +} + +"Subtract an unsigned integer number from another unsigned integer number" +type ArithmeticU64_Sub_Entity implements Arithmetic_ArithmeticGate_Component & Entity { + _c__arithmetic__arithmetic_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type ArithmeticU64_Sub_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [ArithmeticU64_Sub_Entity!]! +} + +"Mutations for entities and relations on the namespace Base" +type BaseMutations { + "A simple comment" + comment(description: String, id: ID, ids: [ID!], label: String, name: String): Base_Comment_Entity_Mutations! + createComment(description: String!, id: ID, name: String!): Base_Comment_Entity! +} + +"Queries for components, entities and relations on the namespace Base" +type BaseNamespace { + "A simple comment" + comment(description: String, id: String, label: String, name: String): [Base_Comment_Entity!]! + "The entity or relation has a description." + describableComponent: [Base_Describable_Component!]! + "The entity is licensed." + licensedComponent: [Base_Licensed_Component!]! + "The entity or relation has a name." + namedComponent: [Base_Named_Component!]! + "The relations between two entities are ordered using a ordinal number associated with sibling relations" + orderedComponent: [Base_Ordered_Component!]! + "The entity is versioned." + versionedComponent: [Base_Versioned_Component!]! +} + +"A simple comment" +type Base_Comment_Entity implements Base_Describable_Component & Base_Named_Component & Entity { + _c__base__describable: ID + _c__base__named: ID + "The description of an entity or a relation" + description: String + id: ID! + "The name of an entity or a relation" + name: String +} + +type Base_Comment_Entity_Mutations { + delete: [ID!]! + update(description: String, name: String): [Base_Comment_Entity!]! +} + +"Mutations for entities and relations on the namespace Binary" +type BinaryMutations { + createLoadBinaryData(data_url: String!, filename: String!, id: ID, name: String!, trigger: Boolean!): Binary_LoadBinaryData_Entity! + createSaveBinaryData(data_url: String!, filename: String!, id: ID, name: String!, trigger: Boolean!): Binary_SaveBinaryData_Entity! + "Loads binary data" + loadBinaryData(data_url: String, filename: String, id: ID, ids: [ID!], label: String, name: String, trigger: Boolean): Binary_LoadBinaryData_Entity_Mutations! + "Saves binary data" + saveBinaryData(data_url: String, filename: String, id: ID, ids: [ID!], label: String, name: String, trigger: Boolean): Binary_SaveBinaryData_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Binary" +type BinaryNamespace { + binaryDataComponent: [Binary_BinaryData_Component!]! + "Loads binary data" + loadBinaryData(data_url: String, filename: String, id: String, label: String, name: String, trigger: Boolean): [Binary_LoadBinaryData_Entity!]! + "Loads binary data" + loadBinaryDataComponent: [Binary_LoadBinaryData_Component!]! + "Saves binary data" + saveBinaryData(data_url: String, filename: String, id: String, label: String, name: String, trigger: Boolean): [Binary_SaveBinaryData_Entity!]! + "Saves binary data" + saveBinaryDataComponent: [Binary_SaveBinaryData_Component!]! +} + +"Loads binary data" +type Binary_LoadBinaryData_Entity implements Base_Named_Component & Binary_BinaryData_Component & Binary_LoadBinaryData_Component & Entity & File_File_Component & Trigger_Action_Component { + _c__base__named: ID + _c__binary__binary_data: ID + _c__binary__load_binary_data: ID + _c__file__file: ID + _c__trigger__action: ID + data_url: String + "The filename" + filename: String + id: ID! + "The name of an entity or a relation" + name: String + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Binary_LoadBinaryData_Entity_Mutations { + delete: [ID!]! + trigger: [Binary_LoadBinaryData_Entity!]! + update(data_url: String, filename: String, name: String, trigger: Boolean): [Binary_LoadBinaryData_Entity!]! +} + +"Saves binary data" +type Binary_SaveBinaryData_Entity implements Base_Named_Component & Binary_BinaryData_Component & Binary_SaveBinaryData_Component & Entity & File_File_Component & Trigger_Action_Component { + _c__base__named: ID + _c__binary__binary_data: ID + _c__binary__save_binary_data: ID + _c__file__file: ID + _c__trigger__action: ID + data_url: String + "The filename" + filename: String + id: ID! + "The name of an entity or a relation" + name: String + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Binary_SaveBinaryData_Entity_Mutations { + delete: [ID!]! + trigger: [Binary_SaveBinaryData_Entity!]! + update(data_url: String, filename: String, name: String, trigger: Boolean): [Binary_SaveBinaryData_Entity!]! +} + +"Mutations for entities and relations on the namespace Color" +type ColorMutations { + createHsl(hue: Float!, id: ID, lightness: Float!, saturation: Float!): Color_Hsl_Entity! + createHsv(brightness: Float!, hue: Float!, id: ID, saturation: Float!): Color_Hsv_Entity! + createHsvToRgb(blue: Float!, brightness: Float!, green: Float!, hue: Float!, id: ID, red: Float!, saturation: Float!): Color_HsvToRgb_Entity! + createRgb(blue: Float!, green: Float!, id: ID, red: Float!): Color_Rgb_Entity! + createRgbToHsv(blue: Float!, brightness: Float!, green: Float!, hue: Float!, id: ID, red: Float!, saturation: Float!): Color_RgbToHsv_Entity! + createRgba(alpha: Float!, blue: Float!, green: Float!, id: ID, red: Float!): Color_Rgba_Entity! + "The color in HSL color space (Hue, saturation, lightness)." + hsl(hue: Float, id: ID, ids: [ID!], label: String, lightness: Float, saturation: Float): Color_Hsl_Entity_Mutations! + "The color in HSV color space (Hue, saturation, value)" + hsv(brightness: Float, hue: Float, id: ID, ids: [ID!], label: String, saturation: Float): Color_Hsv_Entity_Mutations! + "Converts the color in HSV color space to RGB color space" + hsvToRgb(blue: Float, brightness: Float, green: Float, hue: Float, id: ID, ids: [ID!], label: String, red: Float, saturation: Float): Color_HsvToRgb_Entity_Mutations! + "The color in RGB color space." + rgb(blue: Float, green: Float, id: ID, ids: [ID!], label: String, red: Float): Color_Rgb_Entity_Mutations! + "Converts the color in RGB color space to HSV color space" + rgbToHsv(blue: Float, brightness: Float, green: Float, hue: Float, id: ID, ids: [ID!], label: String, red: Float, saturation: Float): Color_RgbToHsv_Entity_Mutations! + "The color in RGB color space with the alpha channel." + rgba(alpha: Float, blue: Float, green: Float, id: ID, ids: [ID!], label: String, red: Float): Color_Rgba_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Color" +type ColorNamespace { + "The alpha component" + alphaComponent: [Color_Alpha_Component!]! + "The brightness component" + brightnessComponent: [Color_Brightness_Component!]! + "The HS components" + hsComponent: [Color_Hs_Component!]! + "The color in HSL color space (Hue, saturation, lightness)." + hsl(hue: Float, id: String, label: String, lightness: Float, saturation: Float): [Color_Hsl_Entity!]! + "The color in HSV color space (Hue, saturation, value)" + hsv(brightness: Float, hue: Float, id: String, label: String, saturation: Float): [Color_Hsv_Entity!]! + "Converts the color in HSV color space to RGB color space" + hsvToRgb(blue: Float, brightness: Float, green: Float, hue: Float, id: String, label: String, red: Float, saturation: Float): [Color_HsvToRgb_Entity!]! + "The lightness component" + lightnessComponent: [Color_Lightness_Component!]! + "The color in RGB color space." + rgb(blue: Float, green: Float, id: String, label: String, red: Float): [Color_Rgb_Entity!]! + "The color in RGB color space." + rgbComponent: [Color_Rgb_Component!]! + "Converts the color in RGB color space to HSV color space" + rgbToHsv(blue: Float, brightness: Float, green: Float, hue: Float, id: String, label: String, red: Float, saturation: Float): [Color_RgbToHsv_Entity!]! + "The color in RGB color space with the alpha channel." + rgba(alpha: Float, blue: Float, green: Float, id: String, label: String, red: Float): [Color_Rgba_Entity!]! +} + +"The color in HSL color space (Hue, saturation, lightness)." +type Color_Hsl_Entity implements Color_Hs_Component & Color_Lightness_Component & Entity { + _c__color__hs: ID + _c__color__lightness: ID + "The hue of the color, in degrees. Decides if it’s red, blue, purple, etc." + hue: Float + id: ID! + "Decides how light the color will look. 0.0 will be black, 0.5 will give a clear color, and 1.0 will give white." + lightness: Float + "The colorfulness of the color. 0.0 gives gray scale colors and 1.0 will give absolutely clear colors." + saturation: Float +} + +type Color_Hsl_Entity_Mutations { + delete: [ID!]! + update(hue: Float, lightness: Float, saturation: Float): [Color_Hsl_Entity!]! +} + +"Converts the color in HSV color space to RGB color space" +type Color_HsvToRgb_Entity implements Color_Brightness_Component & Color_Hs_Component & Color_Rgb_Component & Entity { + _c__color__brightness: ID + _c__color__hs: ID + _c__color__rgb: ID + "Blue" + blue: Float + "Decides how bright the color will look. 0.0 will be black, and 1.0 will give a bright an clear color that goes towards white when saturation goes towards 0.0." + brightness: Float + "Green" + green: Float + "The hue of the color, in degrees. Decides if it’s red, blue, purple, etc." + hue: Float + id: ID! + "Red" + red: Float + "The colorfulness of the color. 0.0 gives gray scale colors and 1.0 will give absolutely clear colors." + saturation: Float +} + +type Color_HsvToRgb_Entity_Mutations { + delete: [ID!]! + update(blue: Float, brightness: Float, green: Float, hue: Float, red: Float, saturation: Float): [Color_HsvToRgb_Entity!]! +} + +"The color in HSV color space (Hue, saturation, value)" +type Color_Hsv_Entity implements Color_Brightness_Component & Color_Hs_Component & Entity { + _c__color__brightness: ID + _c__color__hs: ID + "Decides how bright the color will look. 0.0 will be black, and 1.0 will give a bright an clear color that goes towards white when saturation goes towards 0.0." + brightness: Float + "The hue of the color, in degrees. Decides if it’s red, blue, purple, etc." + hue: Float + id: ID! + "The colorfulness of the color. 0.0 gives gray scale colors and 1.0 will give absolutely clear colors." + saturation: Float +} + +type Color_Hsv_Entity_Mutations { + delete: [ID!]! + update(brightness: Float, hue: Float, saturation: Float): [Color_Hsv_Entity!]! +} + +"Converts the color in RGB color space to HSV color space" +type Color_RgbToHsv_Entity implements Color_Brightness_Component & Color_Hs_Component & Color_Rgb_Component & Entity { + _c__color__brightness: ID + _c__color__hs: ID + _c__color__rgb: ID + "Blue" + blue: Float + "Decides how bright the color will look. 0.0 will be black, and 1.0 will give a bright an clear color that goes towards white when saturation goes towards 0.0." + brightness: Float + "Green" + green: Float + "The hue of the color, in degrees. Decides if it’s red, blue, purple, etc." + hue: Float + id: ID! + "Red" + red: Float + "The colorfulness of the color. 0.0 gives gray scale colors and 1.0 will give absolutely clear colors." + saturation: Float +} + +type Color_RgbToHsv_Entity_Mutations { + delete: [ID!]! + update(blue: Float, brightness: Float, green: Float, hue: Float, red: Float, saturation: Float): [Color_RgbToHsv_Entity!]! +} + +"The color in RGB color space." +type Color_Rgb_Entity implements Color_Rgb_Component & Entity { + _c__color__rgb: ID + "Blue" + blue: Float + "Green" + green: Float + id: ID! + "Red" + red: Float +} + +type Color_Rgb_Entity_Mutations { + delete: [ID!]! + update(blue: Float, green: Float, red: Float): [Color_Rgb_Entity!]! +} + +"The color in RGB color space with the alpha channel." +type Color_Rgba_Entity implements Color_Alpha_Component & Color_Rgb_Component & Entity { + _c__color__alpha: ID + _c__color__rgb: ID + "Transparency component. 0.0 is fully transparent. 1.0 is fully opaque." + alpha: Float + "Blue" + blue: Float + "Green" + green: Float + id: ID! + "Red" + red: Float +} + +type Color_Rgba_Entity_Mutations { + delete: [ID!]! + update(alpha: Float, blue: Float, green: Float, red: Float): [Color_Rgba_Entity!]! +} + +"Mutations for entities and relations on the namespace Comparison" +type ComparisonMutations { + createEquals(id: ID, lhs: JSON!, result: Boolean, rhs: JSON!): Comparison_Equals_Entity! + createGreaterThan(id: ID, lhs: Float!, result: Boolean, rhs: Float!): Comparison_GreaterThan_Entity! + createGreaterThanOrEquals(id: ID, lhs: Float!, result: Boolean, rhs: Float!): Comparison_GreaterThanOrEquals_Entity! + createLowerThan(id: ID, lhs: Float!, result: Boolean, rhs: Float!): Comparison_LowerThan_Entity! + createLowerThanOrEquals(id: ID, lhs: Float!, result: Boolean, rhs: Float!): Comparison_LowerThanOrEquals_Entity! + createNotEquals(id: ID, lhs: JSON!, result: Boolean, rhs: JSON!): Comparison_NotEquals_Entity! + "Checks if lhs is equal to rhs" + equals(id: ID, ids: [ID!], label: String, lhs: JSON, result: Boolean, rhs: JSON): Comparison_Equals_Entity_Mutations! + "Checks if lhs is greater than rhs" + greaterThan(id: ID, ids: [ID!], label: String, lhs: Float, result: Boolean, rhs: Float): Comparison_GreaterThan_Entity_Mutations! + "Checks if lhs is greater than or equal to rhs" + greaterThanOrEquals(id: ID, ids: [ID!], label: String, lhs: Float, result: Boolean, rhs: Float): Comparison_GreaterThanOrEquals_Entity_Mutations! + "Checks if lhs is lower than rhs" + lowerThan(id: ID, ids: [ID!], label: String, lhs: Float, result: Boolean, rhs: Float): Comparison_LowerThan_Entity_Mutations! + "Checks if lhs is lower than or equal to rhs" + lowerThanOrEquals(id: ID, ids: [ID!], label: String, lhs: Float, result: Boolean, rhs: Float): Comparison_LowerThanOrEquals_Entity_Mutations! + "Checks if lhs not equal to rhs" + notEquals(id: ID, ids: [ID!], label: String, lhs: JSON, result: Boolean, rhs: JSON): Comparison_NotEquals_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Comparison" +type ComparisonNamespace { + comparisonGateComponent: [Comparison_ComparisonGate_Component!]! + comparisonNumericComponent: [Comparison_ComparisonNumeric_Component!]! + "Checks if lhs is equal to rhs" + equals(id: String, label: String, lhs: JSON, result: Boolean, rhs: JSON): [Comparison_Equals_Entity!]! + "Checks if lhs is greater than rhs" + greaterThan(id: String, label: String, lhs: Float, result: Boolean, rhs: Float): [Comparison_GreaterThan_Entity!]! + "Checks if lhs is greater than or equal to rhs" + greaterThanOrEquals(id: String, label: String, lhs: Float, result: Boolean, rhs: Float): [Comparison_GreaterThanOrEquals_Entity!]! + "Checks if lhs is lower than rhs" + lowerThan(id: String, label: String, lhs: Float, result: Boolean, rhs: Float): [Comparison_LowerThan_Entity!]! + "Checks if lhs is lower than or equal to rhs" + lowerThanOrEquals(id: String, label: String, lhs: Float, result: Boolean, rhs: Float): [Comparison_LowerThanOrEquals_Entity!]! + "Checks if lhs not equal to rhs" + notEquals(id: String, label: String, lhs: JSON, result: Boolean, rhs: JSON): [Comparison_NotEquals_Entity!]! +} + +"Checks if lhs is equal to rhs" +type Comparison_Equals_Entity implements Comparison_ComparisonGate_Component & Entity & Result_ResultBoolean_Component { + _c__comparison__comparison_gate: ID + _c__result__result_boolean: ID + id: ID! + lhs: JSON + "The result" + result: Boolean + rhs: JSON +} + +type Comparison_Equals_Entity_Mutations { + delete: [ID!]! + update(lhs: JSON, rhs: JSON): [Comparison_Equals_Entity!]! +} + +"Checks if lhs is greater than or equal to rhs" +type Comparison_GreaterThanOrEquals_Entity implements Comparison_ComparisonNumeric_Component & Entity & Result_ResultBoolean_Component { + _c__comparison__comparison_numeric: ID + _c__result__result_boolean: ID + id: ID! + lhs: Float + "The result" + result: Boolean + rhs: Float +} + +type Comparison_GreaterThanOrEquals_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [Comparison_GreaterThanOrEquals_Entity!]! +} + +"Checks if lhs is greater than rhs" +type Comparison_GreaterThan_Entity implements Comparison_ComparisonNumeric_Component & Entity & Result_ResultBoolean_Component { + _c__comparison__comparison_numeric: ID + _c__result__result_boolean: ID + id: ID! + lhs: Float + "The result" + result: Boolean + rhs: Float +} + +type Comparison_GreaterThan_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [Comparison_GreaterThan_Entity!]! +} + +"Checks if lhs is lower than or equal to rhs" +type Comparison_LowerThanOrEquals_Entity implements Comparison_ComparisonNumeric_Component & Entity & Result_ResultBoolean_Component { + _c__comparison__comparison_numeric: ID + _c__result__result_boolean: ID + id: ID! + lhs: Float + "The result" + result: Boolean + rhs: Float +} + +type Comparison_LowerThanOrEquals_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [Comparison_LowerThanOrEquals_Entity!]! +} + +"Checks if lhs is lower than rhs" +type Comparison_LowerThan_Entity implements Comparison_ComparisonNumeric_Component & Entity & Result_ResultBoolean_Component { + _c__comparison__comparison_numeric: ID + _c__result__result_boolean: ID + id: ID! + lhs: Float + "The result" + result: Boolean + rhs: Float +} + +type Comparison_LowerThan_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, rhs: Float): [Comparison_LowerThan_Entity!]! +} + +"Checks if lhs not equal to rhs" +type Comparison_NotEquals_Entity implements Comparison_ComparisonGate_Component & Entity & Result_ResultBoolean_Component { + _c__comparison__comparison_gate: ID + _c__result__result_boolean: ID + id: ID! + lhs: JSON + "The result" + result: Boolean + rhs: JSON +} + +type Comparison_NotEquals_Entity_Mutations { + delete: [ID!]! + update(lhs: JSON, rhs: JSON): [Comparison_NotEquals_Entity!]! +} + +"Mutations for entities and relations on the namespace Config" +type ConfigMutations { + "Loads a configuration file" + configFile(filename: String, id: ID, ids: [ID!], label: String, name: String, result: JSON, trigger: Boolean): Config_ConfigFile_Entity_Mutations! + createConfigFile(filename: String!, id: ID, name: String!, result: JSON!, trigger: Boolean!): Config_ConfigFile_Entity! +} + +"Queries for components, entities and relations on the namespace Config" +type ConfigNamespace { + "Loads a configuration file" + configFile(filename: String, id: String, label: String, name: String, result: JSON, trigger: Boolean): [Config_ConfigFile_Entity!]! + "Loads a configuration file" + configFileComponent: [Config_ConfigFile_Component!]! +} + +"Loads a configuration file" +type Config_ConfigFile_Entity implements Base_Named_Component & Config_ConfigFile_Component & Entity & File_File_Component & Trigger_Action_Component { + _c__base__named: ID + _c__config__config_file: ID + _c__file__file: ID + _c__trigger__action: ID + "The filename" + filename: String + id: ID! + "The name of an entity or a relation" + name: String + result: JSON + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Config_ConfigFile_Entity_Mutations { + delete: [ID!]! + trigger: [Config_ConfigFile_Entity!]! + update(filename: String, name: String, result: JSON, trigger: Boolean): [Config_ConfigFile_Entity!]! +} + +"Mutations for entities and relations on the namespace Connector" +type ConnectorMutations { + "Connects a property with a other property and buffers the values in a FIFO buffer before propagation" + bufferedFifoConnector(inboundId: ID, label: String, outboundId: ID): Connector_BufferedFifoConnector_Relation_Mutations! + createBufferedFifoConnector(buffer: [JSON!]!, buffer_size: Float!, inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_BufferedFifoConnector_Relation! + createDebounceConnector(inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_DebounceConnector_Relation! + createDebugConnector(inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_DebugConnector_Relation! + createDecrementByConnector(inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_DecrementByConnector_Relation! + createDefaultConnector(inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_DefaultConnector_Relation! + createDelayConnector(delay: Float!, inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_DelayConnector_Relation! + createIncrementByConnector(inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_IncrementByConnector_Relation! + createNumericInterpolationConnector(buffer: [JSON!]!, buffer_size: Float!, inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_NumericInterpolationConnector_Relation! + createParseFloatConnector(inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_ParseFloatConnector_Relation! + createParseIntConnector(inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_ParseIntConnector_Relation! + createThreadedConnector(inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_ThreadedConnector_Relation! + createToStringConnector(inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_ToStringConnector_Relation! + createTraceConnector(inboundId: ID, inbound_property_name: String!, instanceId: ID, outboundId: ID, outbound_property_name: String!): Connector_TraceConnector_Relation! + "Connects a property with a other property and propagates the value if and only if the value is different" + debounceConnector(inboundId: ID, label: String, outboundId: ID): Connector_DebounceConnector_Relation_Mutations! + "Connects a property with a other property and logs changes to the debug logger" + debugConnector(inboundId: ID, label: String, outboundId: ID): Connector_DebugConnector_Relation_Mutations! + "Connects a outbound property with another property. The value of the outbound property will be subtracted from the value of the inbound property." + decrementByConnector(inboundId: ID, label: String, outboundId: ID): Connector_DecrementByConnector_Relation_Mutations! + "Connects a property of an entity instance with a other property of another entity instance" + defaultConnector(inboundId: ID, label: String, outboundId: ID): Connector_DefaultConnector_Relation_Mutations! + "Connects a property with a other property after the given milli seconds" + delayConnector(inboundId: ID, label: String, outboundId: ID): Connector_DelayConnector_Relation_Mutations! + "Connects a outbound property with another property. The value of the outbound property will be added to the value of the inbound property." + incrementByConnector(inboundId: ID, label: String, outboundId: ID): Connector_IncrementByConnector_Relation_Mutations! + "Connects a property with a other property and interpolate the numeric values before propagation" + numericInterpolationConnector(inboundId: ID, label: String, outboundId: ID): Connector_NumericInterpolationConnector_Relation_Mutations! + "Connects an string property of an entity instance with a number property of another entity instance. Outgoing string point values gets converted to floating point numbers if possible" + parseFloatConnector(inboundId: ID, label: String, outboundId: ID): Connector_ParseFloatConnector_Relation_Mutations! + "Connects an string property of an entity instance with a number property of another entity instance. Outgoing string values gets converted to integer numbers if possible" + parseIntConnector(inboundId: ID, label: String, outboundId: ID): Connector_ParseIntConnector_Relation_Mutations! + "Connects a property with a other property. The propagation will run in a new thread" + threadedConnector(inboundId: ID, label: String, outboundId: ID): Connector_ThreadedConnector_Relation_Mutations! + "Connects an number property of an entity instance with a string property of another entity instance. Outgoing integer values gets converted to string" + toStringConnector(inboundId: ID, label: String, outboundId: ID): Connector_ToStringConnector_Relation_Mutations! + "Connects a property with a other property and logs changes to the trace logger" + traceConnector(inboundId: ID, label: String, outboundId: ID): Connector_TraceConnector_Relation_Mutations! +} + +"Queries for components, entities and relations on the namespace Connector" +type ConnectorNamespace { + "A buffer of the given size" + bufferComponent: [Connector_Buffer_Component!]! + "Connects a property with a other property and buffers the values in a FIFO buffer before propagation" + bufferedFifoConnector(buffer: [JSON!], buffer_size: Float, inbound_property_name: String, outbound_property_name: String): [Connector_BufferedFifoConnector_Relation!]! + "Connects a property of an entity instance with a other property of another entity instance" + connectorComponent: [Connector_Connector_Component!]! + "Connects a property with a other property and propagates the value if and only if the value is different" + debounceConnector(inbound_property_name: String, outbound_property_name: String): [Connector_DebounceConnector_Relation!]! + "Connects a property with a other property and logs changes to the debug logger" + debugConnector(inbound_property_name: String, outbound_property_name: String): [Connector_DebugConnector_Relation!]! + "Connects a outbound property with another property. The value of the outbound property will be subtracted from the value of the inbound property." + decrementByConnector(inbound_property_name: String, outbound_property_name: String): [Connector_DecrementByConnector_Relation!]! + "Connects a property of an entity instance with a other property of another entity instance" + defaultConnector(inbound_property_name: String, outbound_property_name: String): [Connector_DefaultConnector_Relation!]! + "Connects a property with a other property after the given milli seconds" + delayConnector(delay: Float, inbound_property_name: String, outbound_property_name: String): [Connector_DelayConnector_Relation!]! + "Connects a outbound property with another property. The value of the outbound property will be added to the value of the inbound property." + incrementByConnector(inbound_property_name: String, outbound_property_name: String): [Connector_IncrementByConnector_Relation!]! + "Connects a property with a other property and interpolate the numeric values before propagation" + numericInterpolationConnector(buffer: [JSON!], buffer_size: Float, inbound_property_name: String, outbound_property_name: String): [Connector_NumericInterpolationConnector_Relation!]! + "Connects an string property of an entity instance with a number property of another entity instance. Outgoing string point values gets converted to floating point numbers if possible" + parseFloatConnector(inbound_property_name: String, outbound_property_name: String): [Connector_ParseFloatConnector_Relation!]! + "Connects an string property of an entity instance with a number property of another entity instance. Outgoing string values gets converted to integer numbers if possible" + parseIntConnector(inbound_property_name: String, outbound_property_name: String): [Connector_ParseIntConnector_Relation!]! + "Counts the number of propagations" + propagationCounterComponent: [Connector_PropagationCounter_Component!]! + "Connects a property with a other property. The propagation will run in a new thread" + threadedConnector(inbound_property_name: String, outbound_property_name: String): [Connector_ThreadedConnector_Relation!]! + "Connects an number property of an entity instance with a string property of another entity instance. Outgoing integer values gets converted to string" + toStringConnector(inbound_property_name: String, outbound_property_name: String): [Connector_ToStringConnector_Relation!]! + "Connects a property with a other property and logs changes to the trace logger" + traceConnector(inbound_property_name: String, outbound_property_name: String): [Connector_TraceConnector_Relation!]! +} + +"Connects a property with a other property and buffers the values in a FIFO buffer before propagation" +type Connector_BufferedFifoConnector_Relation implements Connector_Buffer_Component & Connector_Connector_Component & Relation { + _c__connector__buffer: ID + _c__connector__connector: ID + "The buffer with up to buffer_size elements" + buffer: JSON + "The number of elements of the buffer" + buffer_size: Float + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_BufferedFifoConnector_Relation_Mutations { + delete: [ID!]! + update(buffer: [JSON!], buffer_size: Float, inbound_property_name: String, outbound_property_name: String): [Connector_BufferedFifoConnector_Relation!]! +} + +"Connects a property with a other property and propagates the value if and only if the value is different" +type Connector_DebounceConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_DebounceConnector_Relation_Mutations { + delete: [ID!]! + update(inbound_property_name: String, outbound_property_name: String): [Connector_DebounceConnector_Relation!]! +} + +"Connects a property with a other property and logs changes to the debug logger" +type Connector_DebugConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_DebugConnector_Relation_Mutations { + delete: [ID!]! + update(inbound_property_name: String, outbound_property_name: String): [Connector_DebugConnector_Relation!]! +} + +"Connects a outbound property with another property. The value of the outbound property will be subtracted from the value of the inbound property." +type Connector_DecrementByConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_DecrementByConnector_Relation_Mutations { + delete: [ID!]! + update(inbound_property_name: String, outbound_property_name: String): [Connector_DecrementByConnector_Relation!]! +} + +"Connects a property of an entity instance with a other property of another entity instance" +type Connector_DefaultConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_DefaultConnector_Relation_Mutations { + delete: [ID!]! + update(inbound_property_name: String, outbound_property_name: String): [Connector_DefaultConnector_Relation!]! +} + +"Connects a property with a other property after the given milli seconds" +type Connector_DelayConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + "The delay in milli seconds" + delay: Float + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_DelayConnector_Relation_Mutations { + delete: [ID!]! + update(delay: Float, inbound_property_name: String, outbound_property_name: String): [Connector_DelayConnector_Relation!]! +} + +"Connects a outbound property with another property. The value of the outbound property will be added to the value of the inbound property." +type Connector_IncrementByConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_IncrementByConnector_Relation_Mutations { + delete: [ID!]! + update(inbound_property_name: String, outbound_property_name: String): [Connector_IncrementByConnector_Relation!]! +} + +"Connects a property with a other property and interpolate the numeric values before propagation" +type Connector_NumericInterpolationConnector_Relation implements Connector_Buffer_Component & Connector_Connector_Component & Relation { + _c__connector__buffer: ID + _c__connector__connector: ID + "The buffer with up to buffer_size elements" + buffer: JSON + "The number of elements of the buffer" + buffer_size: Float + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_NumericInterpolationConnector_Relation_Mutations { + delete: [ID!]! + update(buffer: [JSON!], buffer_size: Float, inbound_property_name: String, outbound_property_name: String): [Connector_NumericInterpolationConnector_Relation!]! +} + +"Connects an string property of an entity instance with a number property of another entity instance. Outgoing string point values gets converted to floating point numbers if possible" +type Connector_ParseFloatConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_ParseFloatConnector_Relation_Mutations { + delete: [ID!]! + update(inbound_property_name: String, outbound_property_name: String): [Connector_ParseFloatConnector_Relation!]! +} + +"Connects an string property of an entity instance with a number property of another entity instance. Outgoing string values gets converted to integer numbers if possible" +type Connector_ParseIntConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_ParseIntConnector_Relation_Mutations { + delete: [ID!]! + update(inbound_property_name: String, outbound_property_name: String): [Connector_ParseIntConnector_Relation!]! +} + +"Connects a property with a other property. The propagation will run in a new thread" +type Connector_ThreadedConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_ThreadedConnector_Relation_Mutations { + delete: [ID!]! + update(inbound_property_name: String, outbound_property_name: String): [Connector_ThreadedConnector_Relation!]! +} + +"Connects an number property of an entity instance with a string property of another entity instance. Outgoing integer values gets converted to string" +type Connector_ToStringConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_ToStringConnector_Relation_Mutations { + delete: [ID!]! + update(inbound_property_name: String, outbound_property_name: String): [Connector_ToStringConnector_Relation!]! +} + +"Connects a property with a other property and logs changes to the trace logger" +type Connector_TraceConnector_Relation implements Connector_Connector_Component & Relation { + _c__connector__connector: ID + inbound: AllEntities! + "The name of the inbound property" + inbound_property_name: String + instance_id: ID! + key: ID! + outbound: AllEntities! + "The name of the outbound property" + outbound_property_name: String +} + +type Connector_TraceConnector_Relation_Mutations { + delete: [ID!]! + update(inbound_property_name: String, outbound_property_name: String): [Connector_TraceConnector_Relation!]! +} + +"Mutations for entities and relations on the namespace Core" +type CoreMutations { + createShutdown(id: ID, label: String!, shutdown: Boolean!, trigger: Boolean!): Core_Shutdown_Entity! + createSystemEvent(event: JSON, id: ID, label: String!): Core_SystemEvent_Entity! + shutdown(id: ID, ids: [ID!], label: String, shutdown: Boolean, trigger: Boolean): Core_Shutdown_Entity_Mutations! + "Events of the type system" + systemEvent(event: JSON, id: ID, ids: [ID!], label: String): Core_SystemEvent_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Core" +type CoreNamespace { + "This components spawns events." + eventComponent: [Core_Event_Component!]! + "The label is an hierarchical path with static segments, named parameters and catch-all parameters." + labeledComponent: [Core_Labeled_Component!]! + shutdown(id: String, label: String, shutdown: Boolean, trigger: Boolean): [Core_Shutdown_Entity!]! + "Events of the type system" + systemEvent(event: JSON, id: String, label: String): [Core_SystemEvent_Entity!]! +} + +type Core_Shutdown_Entity implements Core_Labeled_Component & Entity & Trigger_Action_Component { + _c__core__labeled: ID + _c__trigger__action: ID + id: ID! + label: String + shutdown: Boolean + trigger: Boolean +} + +type Core_Shutdown_Entity_Mutations { + delete: [ID!]! + trigger: [Core_Shutdown_Entity!]! + update(label: String, shutdown: Boolean, trigger: Boolean): [Core_Shutdown_Entity!]! +} + +"Events of the type system" +type Core_SystemEvent_Entity implements Core_Event_Component & Core_Labeled_Component & Entity { + _c__core__event: ID + _c__core__labeled: ID + event: JSON + id: ID! + label: String +} + +type Core_SystemEvent_Entity_Mutations { + delete: [ID!]! + update(label: String): [Core_SystemEvent_Entity!]! +} + +"Mutations for entities and relations on the namespace DateTime" +type DateTimeMutations { + createDay(day_of_month: Float, id: ID, iso8601: String, label: String!): DateTime_Day_Entity! + createDayOfMonth(day_of_month: Float, inboundId: ID, instanceId: ID, outboundId: ID): DateTime_DayOfMonth_Relation! + createFirstDay(inboundId: ID, instanceId: ID, outboundId: ID): DateTime_FirstDay_Relation! + createFirstMonth(inboundId: ID, instanceId: ID, outboundId: ID): DateTime_FirstMonth_Relation! + createHour(hour_of_day: Float, id: ID, label: String!): DateTime_Hour_Entity! + createLastDay(inboundId: ID, instanceId: ID, outboundId: ID): DateTime_LastDay_Relation! + createLastMonth(inboundId: ID, instanceId: ID, outboundId: ID): DateTime_LastMonth_Relation! + createMinute(id: ID, label: String!, minute: Float): DateTime_Minute_Entity! + createMonth(id: ID, label: String!, month_and_year: String, month_of_year: Float): DateTime_Month_Entity! + createMonthOfYear(inboundId: ID, instanceId: ID, month_of_year: Float, outboundId: ID): DateTime_MonthOfYear_Relation! + createNextDay(inboundId: ID, instanceId: ID, outboundId: ID): DateTime_NextDay_Relation! + createNextMonth(inboundId: ID, instanceId: ID, outboundId: ID): DateTime_NextMonth_Relation! + createNextYear(inboundId: ID, instanceId: ID, outboundId: ID): DateTime_NextYear_Relation! + createThisMonthInNextYear(inboundId: ID, instanceId: ID, outboundId: ID): DateTime_ThisMonthInNextYear_Relation! + createUtcNow(id: ID, result: String, trigger: Boolean!): DateTime_UtcNow_Entity! + createUtcTimestamp(id: ID, result: Float, trigger: Boolean!): DateTime_UtcTimestamp_Entity! + createYear(id: ID, label: String!, leap: Boolean, year: Float): DateTime_Year_Entity! + "Represents a day in the time graph" + day(day_of_month: Float, id: ID, ids: [ID!], iso8601: String, label: String): DateTime_Day_Entity_Mutations! + "Day of the month" + dayOfMonth(inboundId: ID, label: String, outboundId: ID): DateTime_DayOfMonth_Relation_Mutations! + "The first day of the month" + firstDay(inboundId: ID, label: String, outboundId: ID): DateTime_FirstDay_Relation_Mutations! + "The first month of the year" + firstMonth(inboundId: ID, label: String, outboundId: ID): DateTime_FirstMonth_Relation_Mutations! + "Represents an hour in the time graph" + hour(hour_of_day: Float, id: ID, ids: [ID!], label: String): DateTime_Hour_Entity_Mutations! + "The last day of the month" + lastDay(inboundId: ID, label: String, outboundId: ID): DateTime_LastDay_Relation_Mutations! + "The last month of the year" + lastMonth(inboundId: ID, label: String, outboundId: ID): DateTime_LastMonth_Relation_Mutations! + "Represents a minute in the time graph" + minute(id: ID, ids: [ID!], label: String, minute: Float): DateTime_Minute_Entity_Mutations! + "Represents a month in the time graph" + month(id: ID, ids: [ID!], label: String, month_and_year: String, month_of_year: Float): DateTime_Month_Entity_Mutations! + "Month of the year" + monthOfYear(inboundId: ID, label: String, outboundId: ID): DateTime_MonthOfYear_Relation_Mutations! + "The next day." + nextDay(inboundId: ID, label: String, outboundId: ID): DateTime_NextDay_Relation_Mutations! + "The next month." + nextMonth(inboundId: ID, label: String, outboundId: ID): DateTime_NextMonth_Relation_Mutations! + "The next year." + nextYear(inboundId: ID, label: String, outboundId: ID): DateTime_NextYear_Relation_Mutations! + "This month in the next year." + thisMonthInNextYear(inboundId: ID, label: String, outboundId: ID): DateTime_ThisMonthInNextYear_Relation_Mutations! + "Returns the current date as ISO8601" + utcNow(id: ID, ids: [ID!], label: String, result: String, trigger: Boolean): DateTime_UtcNow_Entity_Mutations! + "Returns the current timestamp" + utcTimestamp(id: ID, ids: [ID!], label: String, result: Float, trigger: Boolean): DateTime_UtcTimestamp_Entity_Mutations! + "Represents a year in the time graph" + year(id: ID, ids: [ID!], label: String, leap: Boolean, year: Float): DateTime_Year_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace DateTime" +type DateTimeNamespace { + "Represents a day in the time graph" + day(day_of_month: Float, id: String, iso8601: String, label: String): [DateTime_Day_Entity!]! + "Day of the month" + dayOfMonth(day_of_month: Float): [DateTime_DayOfMonth_Relation!]! + "The first day of the month" + firstDay: [DateTime_FirstDay_Relation!]! + "The first month of the year" + firstMonth: [DateTime_FirstMonth_Relation!]! + "Represents an hour in the time graph" + hour(hour_of_day: Float, id: String, label: String): [DateTime_Hour_Entity!]! + "The last day of the month" + lastDay: [DateTime_LastDay_Relation!]! + "The last month of the year" + lastMonth: [DateTime_LastMonth_Relation!]! + "Represents a minute in the time graph" + minute(id: String, label: String, minute: Float): [DateTime_Minute_Entity!]! + "Represents a month in the time graph" + month(id: String, label: String, month_and_year: String, month_of_year: Float): [DateTime_Month_Entity!]! + "Month of the year" + monthOfYear(month_of_year: Float): [DateTime_MonthOfYear_Relation!]! + "The next day." + nextDay: [DateTime_NextDay_Relation!]! + "The next month." + nextMonth: [DateTime_NextMonth_Relation!]! + "The next year." + nextYear: [DateTime_NextYear_Relation!]! + "This month in the next year." + thisMonthInNextYear: [DateTime_ThisMonthInNextYear_Relation!]! + "Returns the current date as ISO8601" + utcNow(id: String, label: String, result: String, trigger: Boolean): [DateTime_UtcNow_Entity!]! + "Returns the current timestamp" + utcTimestamp(id: String, label: String, result: Float, trigger: Boolean): [DateTime_UtcTimestamp_Entity!]! + "Represents a year in the time graph" + year(id: String, label: String, leap: Boolean, year: Float): [DateTime_Year_Entity!]! +} + +"Day of the month" +type DateTime_DayOfMonth_Relation implements Relation { + "The day." + day: DateTime_Day_Entity! + "The nth day of the month." + day_of_month: Float + instance_id: ID! + key: ID! + "The month." + month: DateTime_Month_Entity! +} + +type DateTime_DayOfMonth_Relation_Mutations { + delete: [ID!]! +} + +"Represents a day in the time graph" +type DateTime_Day_Entity implements Core_Labeled_Component & Entity { + _c__core__labeled: ID + "The nth day of the month" + day_of_month: Float + id: ID! + "ISO8601 representation of the day" + iso8601: String + label: String + "The month." + month: [DateTime_Month_Entity!]! + "The next day." + next_day: [DateTime_Day_Entity!]! + "The previous day." + previous_day: [DateTime_Day_Entity!]! +} + +type DateTime_Day_Entity_Mutations { + delete: [ID!]! + update(label: String): [DateTime_Day_Entity!]! +} + +"The first day of the month" +type DateTime_FirstDay_Relation implements Relation { + "The first day of the month." + first_day: DateTime_Day_Entity! + instance_id: ID! + key: ID! + "The month." + month: DateTime_Month_Entity! +} + +type DateTime_FirstDay_Relation_Mutations { + delete: [ID!]! +} + +"The first month of the year" +type DateTime_FirstMonth_Relation implements Relation { + "The first month of the year." + first_month: DateTime_Month_Entity! + instance_id: ID! + key: ID! + "The year." + year: DateTime_Year_Entity! +} + +type DateTime_FirstMonth_Relation_Mutations { + delete: [ID!]! +} + +"Represents an hour in the time graph" +type DateTime_Hour_Entity implements Core_Labeled_Component & Entity { + _c__core__labeled: ID + "The nth hour of the day" + hour_of_day: Float + id: ID! + label: String +} + +type DateTime_Hour_Entity_Mutations { + delete: [ID!]! + update(label: String): [DateTime_Hour_Entity!]! +} + +"The last day of the month" +type DateTime_LastDay_Relation implements Relation { + instance_id: ID! + key: ID! + "The last day of the month." + last_day: DateTime_Day_Entity! + "The month." + month: DateTime_Month_Entity! +} + +type DateTime_LastDay_Relation_Mutations { + delete: [ID!]! +} + +"The last month of the year" +type DateTime_LastMonth_Relation implements Relation { + instance_id: ID! + key: ID! + "The last month of the year." + last_month: DateTime_Month_Entity! + "The year." + year: DateTime_Year_Entity! +} + +type DateTime_LastMonth_Relation_Mutations { + delete: [ID!]! +} + +"Represents a minute in the time graph" +type DateTime_Minute_Entity implements Core_Labeled_Component & Entity { + _c__core__labeled: ID + id: ID! + label: String + "The nth minute of the hour" + minute: Float +} + +type DateTime_Minute_Entity_Mutations { + delete: [ID!]! + update(label: String): [DateTime_Minute_Entity!]! +} + +"Month of the year" +type DateTime_MonthOfYear_Relation implements Relation { + instance_id: ID! + key: ID! + "The month." + month: DateTime_Month_Entity! + "The nth month of the year." + month_of_year: Float + "The year." + year: DateTime_Year_Entity! +} + +type DateTime_MonthOfYear_Relation_Mutations { + delete: [ID!]! +} + +"Represents a month in the time graph" +type DateTime_Month_Entity implements Core_Labeled_Component & Entity { + _c__core__labeled: ID + "The days of this month." + days: [DateTime_Day_Entity!]! + "Relates the month with the days." + days_of_month: [DateTime_DayOfMonth_Relation!]! + "The first day of the month." + first_day: [DateTime_Day_Entity!]! + id: ID! + label: String + "The last day of the month." + last_day: [DateTime_Day_Entity!]! + "String representation of the month and year" + month_and_year: String + "This month in next year." + month_in_next_year: [DateTime_Month_Entity!]! + "This month in previous year." + month_in_previous_year: [DateTime_Month_Entity!]! + "The nth month of a year" + month_of_year: Float + "The next month." + next_month: [DateTime_Month_Entity!]! + "The previous month." + previous_month: [DateTime_Month_Entity!]! + "The year." + year: [DateTime_Year_Entity!]! +} + +type DateTime_Month_Entity_Mutations { + delete: [ID!]! + update(label: String): [DateTime_Month_Entity!]! +} + +"The next day." +type DateTime_NextDay_Relation implements Relation { + instance_id: ID! + key: ID! + "The next day." + next_day: DateTime_Day_Entity! + "The previous day." + previous_day: DateTime_Day_Entity! +} + +type DateTime_NextDay_Relation_Mutations { + delete: [ID!]! +} + +"The next month." +type DateTime_NextMonth_Relation implements Relation { + instance_id: ID! + key: ID! + "The next month." + next_month: DateTime_Month_Entity! + "The previous month." + previous_month: DateTime_Month_Entity! +} + +type DateTime_NextMonth_Relation_Mutations { + delete: [ID!]! +} + +"The next year." +type DateTime_NextYear_Relation implements Relation { + instance_id: ID! + key: ID! + "The next year." + next_year: DateTime_Year_Entity! + "The previous year." + previous_year: DateTime_Year_Entity! +} + +type DateTime_NextYear_Relation_Mutations { + delete: [ID!]! +} + +"This month in the next year." +type DateTime_ThisMonthInNextYear_Relation implements Relation { + instance_id: ID! + key: ID! + "This month in next year." + month_in_next_year: DateTime_Month_Entity! + "This month in previous year." + month_in_previous_year: DateTime_Month_Entity! +} + +type DateTime_ThisMonthInNextYear_Relation_Mutations { + delete: [ID!]! +} + +"Returns the current date as ISO8601" +type DateTime_UtcNow_Entity implements Entity & Result_ResultString_Component & Trigger_Action_Component { + _c__result__result_string: ID + _c__trigger__action: ID + id: ID! + "The result" + result: String + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type DateTime_UtcNow_Entity_Mutations { + delete: [ID!]! + trigger: [DateTime_UtcNow_Entity!]! + update(trigger: Boolean): [DateTime_UtcNow_Entity!]! +} + +"Returns the current timestamp" +type DateTime_UtcTimestamp_Entity implements Entity & Result_ResultNumber_Component & Trigger_Action_Component { + _c__result__result_number: ID + _c__trigger__action: ID + id: ID! + "The result" + result: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type DateTime_UtcTimestamp_Entity_Mutations { + delete: [ID!]! + trigger: [DateTime_UtcTimestamp_Entity!]! + update(trigger: Boolean): [DateTime_UtcTimestamp_Entity!]! +} + +"Represents a year in the time graph" +type DateTime_Year_Entity implements Core_Labeled_Component & Entity { + _c__core__labeled: ID + "The first month of the year." + first_month: [DateTime_Month_Entity!]! + id: ID! + label: String + "The last month of the year." + last_month: [DateTime_Month_Entity!]! + "True, if the year is a leap year" + leap: Boolean + "The months of this year." + months: [DateTime_Month_Entity!]! + "Relates the year with the months." + months_of_year: [DateTime_MonthOfYear_Relation!]! + "The next year." + next_year: [DateTime_Year_Entity!]! + "The previous year." + previous_year: [DateTime_Year_Entity!]! + "A year" + year: Float +} + +type DateTime_Year_Entity_Mutations { + delete: [ID!]! + update(label: String): [DateTime_Year_Entity!]! +} + +"Queries for components, entities and relations on the namespace File" +type FileNamespace { + "Represents a file in the file system" + fileComponent: [File_File_Component!]! + "Triggers if the file with the given filename has been changed" + fsNotifyComponent: [File_FsNotify_Component!]! +} + +"Mutations for entities and relations on the namespace Flow" +type FlowMutations { + "A simple comment" + comment(description: String, id: ID, ids: [ID!], label: String, name: String): Flow_Comment_Entity_Mutations! + createComment(description: String!, id: ID, name: String!): Flow_Comment_Entity! + createGenericFlow(id: ID, label: String!): Flow_GenericFlow_Entity! + "Generic flow without inputs and outputs" + genericFlow(id: ID, ids: [ID!], label: String): Flow_GenericFlow_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Flow" +type FlowNamespace { + "A simple comment" + comment(description: String, id: String, label: String, name: String): [Flow_Comment_Entity!]! + "Generic flow without inputs and outputs" + genericFlow(id: String, label: String): [Flow_GenericFlow_Entity!]! +} + +"A simple comment" +type Flow_Comment_Entity implements Base_Describable_Component & Base_Named_Component & Entity { + _c__base__describable: ID + _c__base__named: ID + "The description of an entity or a relation" + description: String + id: ID! + "The name of an entity or a relation" + name: String +} + +type Flow_Comment_Entity_Mutations { + delete: [ID!]! + update(description: String, name: String): [Flow_Comment_Entity!]! +} + +"Generic flow without inputs and outputs" +type Flow_GenericFlow_Entity implements Core_Labeled_Component & Entity { + _c__core__labeled: ID + id: ID! + label: String +} + +type Flow_GenericFlow_Entity_Mutations { + delete: [ID!]! + update(label: String): [Flow_GenericFlow_Entity!]! +} + +"Mutations for entities and relations on the namespace Git" +type GitMutations { + createRepository(branch: String!, description: String!, fast_forward: Boolean!, fetch: Boolean!, filename: String!, id: ID, merge_from: String!, name: String!, push: Boolean!, remote_branch: String!, remote_name: String!, trigger: Boolean!, url: String!): Git_Repository_Entity! + "Git repository" + repository(branch: String, description: String, fast_forward: Boolean, fetch: Boolean, filename: String, id: ID, ids: [ID!], label: String, merge_from: String, name: String, push: Boolean, remote_branch: String, remote_name: String, trigger: Boolean, url: String): Git_Repository_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Git" +type GitNamespace { + "Git repository" + repository(branch: String, description: String, fast_forward: Boolean, fetch: Boolean, filename: String, id: String, label: String, merge_from: String, name: String, push: Boolean, remote_branch: String, remote_name: String, trigger: Boolean, url: String): [Git_Repository_Entity!]! + "Git repository" + repositoryComponent: [Git_Repository_Component!]! + "The transfer progress" + transferProgressComponent: [Git_TransferProgress_Component!]! +} + +"Git repository" +type Git_Repository_Entity implements Base_Describable_Component & Base_Named_Component & Entity & File_File_Component & Git_Repository_Component & Http_Url_Component & Trigger_Action_Component { + _c__base__describable: ID + _c__base__named: ID + _c__file__file: ID + _c__git__repository: ID + _c__http__url: ID + _c__trigger__action: ID + "The current branch name." + branch: String + "The description of an entity or a relation" + description: String + "Fast forward" + fast_forward: Boolean + "Fetches the remotes" + fetch: Boolean + "The filename" + filename: String + id: ID! + "Merges the given local branch into the current branch" + merge_from: String + "The name of an entity or a relation" + name: String + "Pushes the current branch to the remote" + push: Boolean + "The branch of the remote repository." + remote_branch: String + "The name of the remote repository." + remote_name: String + "On receiving a boolean trigger the action will be executed" + trigger: Boolean + "Uniform Resource Locator" + url: String +} + +type Git_Repository_Entity_Mutations { + delete: [ID!]! + trigger: [Git_Repository_Entity!]! + update(branch: String, description: String, fast_forward: Boolean, fetch: Boolean, filename: String, merge_from: String, name: String, push: Boolean, remote_branch: String, remote_name: String, trigger: Boolean, url: String): [Git_Repository_Entity!]! +} + +"Mutations for entities and relations on the namespace Http" +type HttpMutations { + createHttp(id: ID, method: String!, payload: JSON!, request_headers: JSON!, response_headers: JSON, result: JSON, status: Float, trigger: Boolean!, url: String!): Http_Http_Entity! + createJsonRpc(error: JSON, id: ID, json_rpc_version: String!, method: String!, params: JSON!, result: JSON, trigger: Boolean!, url: String!): Http_JsonRpc_Entity! + "Sends HTTP request to a given URL and returns the result object" + http(id: ID, ids: [ID!], label: String, method: String, payload: JSON, request_headers: JSON, response_headers: JSON, result: JSON, status: Float, trigger: Boolean, url: String): Http_Http_Entity_Mutations! + "Sends JSON-RPC request to a given URL and returns the result object" + jsonRpc(error: JSON, id: ID, ids: [ID!], json_rpc_version: String, label: String, method: String, params: JSON, result: JSON, trigger: Boolean, url: String): Http_JsonRpc_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Http" +type HttpNamespace { + "Sends HTTP request to a given URL and returns the result object" + http(id: String, label: String, method: String, payload: JSON, request_headers: JSON, response_headers: JSON, result: JSON, status: Float, trigger: Boolean, url: String): [Http_Http_Entity!]! + "Sends HTTP request to a given URL" + httpComponent: [Http_Http_Component!]! + "Sends JSON-RPC request to a given URL and returns the result object" + jsonRpc(error: JSON, id: String, json_rpc_version: String, label: String, method: String, params: JSON, result: JSON, trigger: Boolean, url: String): [Http_JsonRpc_Entity!]! + "Sends JSON-RPC request to a given URL" + jsonRpcComponent: [Http_JsonRpc_Component!]! + "A HTTP request" + requestComponent: [Http_Request_Component!]! + "A HTTP response" + responseComponent: [Http_Response_Component!]! + "A Uniform Resource Locator (URL), colloquially termed as a web address, is a reference to a web resource that specifies its location on a computer network and a mechanism for retrieving it." + urlComponent: [Http_Url_Component!]! +} + +"Sends HTTP request to a given URL and returns the result object" +type Http_Http_Entity implements Entity & Http_Http_Component & Http_Request_Component & Http_Response_Component & Http_Url_Component & Result_ResultObject_Component & Trigger_Action_Component { + _c__http__http: ID + _c__http__request: ID + _c__http__response: ID + _c__http__url: ID + _c__result__result_object: ID + _c__trigger__action: ID + id: ID! + "The HTTP request method" + method: String + "The HTTP request payload" + payload: JSON + "The HTTP request headers" + request_headers: JSON + "The HTTP response headers" + response_headers: JSON + "The result" + result: JSON + "The HTTP response status code" + status: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean + "Uniform Resource Locator" + url: String +} + +type Http_Http_Entity_Mutations { + delete: [ID!]! + trigger: [Http_Http_Entity!]! + update(method: String, payload: JSON, request_headers: JSON, trigger: Boolean, url: String): [Http_Http_Entity!]! +} + +"Sends JSON-RPC request to a given URL and returns the result object" +type Http_JsonRpc_Entity implements Entity & Http_JsonRpc_Component & Http_Url_Component & Result_ResultObject_Component & Trigger_Action_Component { + _c__http__json_rpc: ID + _c__http__url: ID + _c__result__result_object: ID + _c__trigger__action: ID + error: JSON + id: ID! + json_rpc_version: String + method: String + params: JSON + result: JSON + "On receiving a boolean trigger the action will be executed" + trigger: Boolean + "Uniform Resource Locator" + url: String +} + +type Http_JsonRpc_Entity_Mutations { + delete: [ID!]! + trigger: [Http_JsonRpc_Entity!]! + update(json_rpc_version: String, method: String, params: JSON, trigger: Boolean, url: String): [Http_JsonRpc_Entity!]! +} + +"Mutations for entities and relations on the namespace Json" +type JsonMutations { + "Array Contains" + arrayContains(array: [JSON!], id: ID, ids: [ID!], label: String, name: String, result: Boolean, search: JSON): Json_ArrayContains_Entity_Mutations! + "Array Get By Index" + arrayGetByIndex(array: [JSON!], id: ID, ids: [ID!], index: Float, label: String, name: String, result: JSON): Json_ArrayGetByIndex_Entity_Mutations! + "Array Length" + arrayLength(array: [JSON!], id: ID, ids: [ID!], label: String, length: Float, name: String): Json_ArrayLength_Entity_Mutations! + "Array Pop" + arrayPop(array: [JSON!], id: ID, ids: [ID!], label: String, name: String, result: [JSON!], value: JSON): Json_ArrayPop_Entity_Mutations! + "Array Push" + arrayPush(array: [JSON!], id: ID, ids: [ID!], label: String, name: String, result: [JSON!], value: JSON): Json_ArrayPush_Entity_Mutations! + "Array Reverse" + arrayReverse(array: [JSON!], id: ID, ids: [ID!], label: String, name: String, result: [JSON!]): Json_ArrayReverse_Entity_Mutations! + createArrayContains(array: [JSON!]!, id: ID, name: String!, result: Boolean, search: JSON!): Json_ArrayContains_Entity! + createArrayGetByIndex(array: [JSON!]!, id: ID, index: Float!, name: String!, result: JSON): Json_ArrayGetByIndex_Entity! + createArrayLength(array: [JSON!]!, id: ID, length: Float, name: String!): Json_ArrayLength_Entity! + createArrayPop(array: [JSON!]!, id: ID, name: String!, result: [JSON!], value: JSON): Json_ArrayPop_Entity! + createArrayPush(array: [JSON!]!, id: ID, name: String!, result: [JSON!], value: JSON!): Json_ArrayPush_Entity! + createArrayReverse(array: [JSON!]!, id: ID, name: String!, result: [JSON!]): Json_ArrayReverse_Entity! + createLoadJson(filename: String!, id: ID, name: String!, result: JSON, trigger: Boolean!): Json_LoadJson_Entity! + createObjectGetProperty(id: ID, name: String!, object: JSON!, property_name: String!, result: JSON): Json_ObjectGetProperty_Entity! + createObjectKeys(id: ID, keys: [JSON!], name: String!, object: JSON!): Json_ObjectKeys_Entity! + createObjectRemoveProperty(id: ID, name: String!, object: JSON!, property_name: String!, result: JSON): Json_ObjectRemoveProperty_Entity! + createObjectSetProperty(id: ID, name: String!, object: JSON!, property_name: String!, result: JSON, value: JSON!): Json_ObjectSetProperty_Entity! + createSaveJson(filename: String!, id: ID, name: String!, payload: JSON!, trigger: Boolean!): Json_SaveJson_Entity! + "Loads a JSON file" + loadJson(filename: String, id: ID, ids: [ID!], label: String, name: String, result: JSON, trigger: Boolean): Json_LoadJson_Entity_Mutations! + "Object Get Property" + objectGetProperty(id: ID, ids: [ID!], label: String, name: String, object: JSON, property_name: String, result: JSON): Json_ObjectGetProperty_Entity_Mutations! + "Object Keys" + objectKeys(id: ID, ids: [ID!], keys: [JSON!], label: String, name: String, object: JSON): Json_ObjectKeys_Entity_Mutations! + "Object Remove Property" + objectRemoveProperty(id: ID, ids: [ID!], label: String, name: String, object: JSON, property_name: String, result: JSON): Json_ObjectRemoveProperty_Entity_Mutations! + "Object Set Property" + objectSetProperty(id: ID, ids: [ID!], label: String, name: String, object: JSON, property_name: String, result: JSON, value: JSON): Json_ObjectSetProperty_Entity_Mutations! + "Saves an object as JSON file" + saveJson(filename: String, id: ID, ids: [ID!], label: String, name: String, payload: JSON, trigger: Boolean): Json_SaveJson_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Json" +type JsonNamespace { + "Array Contains" + arrayContains(array: [JSON!], id: String, label: String, name: String, result: Boolean, search: JSON): [Json_ArrayContains_Entity!]! + "Array Get By Index" + arrayGetByIndex(array: [JSON!], id: String, index: Float, label: String, name: String, result: JSON): [Json_ArrayGetByIndex_Entity!]! + "Array Length" + arrayLength(array: [JSON!], id: String, label: String, length: Float, name: String): [Json_ArrayLength_Entity!]! + "Array Pop" + arrayPop(array: [JSON!], id: String, label: String, name: String, result: [JSON!], value: JSON): [Json_ArrayPop_Entity!]! + "Array Push" + arrayPush(array: [JSON!], id: String, label: String, name: String, result: [JSON!], value: JSON): [Json_ArrayPush_Entity!]! + "Array Reverse" + arrayReverse(array: [JSON!], id: String, label: String, name: String, result: [JSON!]): [Json_ArrayReverse_Entity!]! + "Loads a JSON file" + loadJson(filename: String, id: String, label: String, name: String, result: JSON, trigger: Boolean): [Json_LoadJson_Entity!]! + "Loads a JSON file" + loadJsonComponent: [Json_LoadJson_Component!]! + "Object Get Property" + objectGetProperty(id: String, label: String, name: String, object: JSON, property_name: String, result: JSON): [Json_ObjectGetProperty_Entity!]! + "Object Keys" + objectKeys(id: String, keys: [JSON!], label: String, name: String, object: JSON): [Json_ObjectKeys_Entity!]! + "Object Remove Property" + objectRemoveProperty(id: String, label: String, name: String, object: JSON, property_name: String, result: JSON): [Json_ObjectRemoveProperty_Entity!]! + "Object Set Property" + objectSetProperty(id: String, label: String, name: String, object: JSON, property_name: String, result: JSON, value: JSON): [Json_ObjectSetProperty_Entity!]! + "Saves an object as JSON file" + saveJson(filename: String, id: String, label: String, name: String, payload: JSON, trigger: Boolean): [Json_SaveJson_Entity!]! + "Saves an object as JSON file" + saveJsonComponent: [Json_SaveJson_Component!]! +} + +"Array Contains" +type Json_ArrayContains_Entity implements Base_Named_Component & Entity { + _c__base__named: ID + array: JSON + id: ID! + "The name of an entity or a relation" + name: String + result: Boolean + search: JSON +} + +type Json_ArrayContains_Entity_Mutations { + delete: [ID!]! + update(array: [JSON!], name: String, search: JSON): [Json_ArrayContains_Entity!]! +} + +"Array Get By Index" +type Json_ArrayGetByIndex_Entity implements Base_Named_Component & Entity { + _c__base__named: ID + array: JSON + id: ID! + index: Float + "The name of an entity or a relation" + name: String + result: JSON +} + +type Json_ArrayGetByIndex_Entity_Mutations { + delete: [ID!]! + update(array: [JSON!], index: Float, name: String): [Json_ArrayGetByIndex_Entity!]! +} + +"Array Length" +type Json_ArrayLength_Entity implements Base_Named_Component & Entity { + _c__base__named: ID + array: JSON + id: ID! + length: Float + "The name of an entity or a relation" + name: String +} + +type Json_ArrayLength_Entity_Mutations { + delete: [ID!]! + update(array: [JSON!], name: String): [Json_ArrayLength_Entity!]! +} + +"Array Pop" +type Json_ArrayPop_Entity implements Base_Named_Component & Entity { + _c__base__named: ID + array: JSON + id: ID! + "The name of an entity or a relation" + name: String + result: JSON + value: JSON +} + +type Json_ArrayPop_Entity_Mutations { + delete: [ID!]! + update(array: [JSON!], name: String): [Json_ArrayPop_Entity!]! +} + +"Array Push" +type Json_ArrayPush_Entity implements Base_Named_Component & Entity { + _c__base__named: ID + array: JSON + id: ID! + "The name of an entity or a relation" + name: String + result: JSON + value: JSON +} + +type Json_ArrayPush_Entity_Mutations { + delete: [ID!]! + update(array: [JSON!], name: String, value: JSON): [Json_ArrayPush_Entity!]! +} + +"Array Reverse" +type Json_ArrayReverse_Entity implements Base_Named_Component & Entity { + _c__base__named: ID + array: JSON + id: ID! + "The name of an entity or a relation" + name: String + result: JSON +} + +type Json_ArrayReverse_Entity_Mutations { + delete: [ID!]! + update(array: [JSON!], name: String): [Json_ArrayReverse_Entity!]! +} + +"Loads a JSON file" +type Json_LoadJson_Entity implements Base_Named_Component & Entity & File_File_Component & Json_LoadJson_Component & Result_ResultAny_Component & Trigger_Action_Component { + _c__base__named: ID + _c__file__file: ID + _c__json__load_json: ID + _c__result__result_any: ID + _c__trigger__action: ID + "The filename" + filename: String + id: ID! + "The name of an entity or a relation" + name: String + "The result" + result: JSON + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Json_LoadJson_Entity_Mutations { + delete: [ID!]! + trigger: [Json_LoadJson_Entity!]! + update(filename: String, name: String, trigger: Boolean): [Json_LoadJson_Entity!]! +} + +"Object Get Property" +type Json_ObjectGetProperty_Entity implements Base_Named_Component & Entity { + _c__base__named: ID + id: ID! + "The name of an entity or a relation" + name: String + object: JSON + property_name: String + result: JSON +} + +type Json_ObjectGetProperty_Entity_Mutations { + delete: [ID!]! + update(name: String, object: JSON, property_name: String): [Json_ObjectGetProperty_Entity!]! +} + +"Object Keys" +type Json_ObjectKeys_Entity implements Base_Named_Component & Entity { + _c__base__named: ID + id: ID! + keys: JSON + "The name of an entity or a relation" + name: String + object: JSON +} + +type Json_ObjectKeys_Entity_Mutations { + delete: [ID!]! + update(name: String, object: JSON): [Json_ObjectKeys_Entity!]! +} + +"Object Remove Property" +type Json_ObjectRemoveProperty_Entity implements Base_Named_Component & Entity { + _c__base__named: ID + id: ID! + "The name of an entity or a relation" + name: String + object: JSON + property_name: String + result: JSON +} + +type Json_ObjectRemoveProperty_Entity_Mutations { + delete: [ID!]! + update(name: String, object: JSON, property_name: String): [Json_ObjectRemoveProperty_Entity!]! +} + +"Object Set Property" +type Json_ObjectSetProperty_Entity implements Base_Named_Component & Entity { + _c__base__named: ID + id: ID! + "The name of an entity or a relation" + name: String + object: JSON + property_name: String + result: JSON + value: JSON +} + +type Json_ObjectSetProperty_Entity_Mutations { + delete: [ID!]! + update(name: String, object: JSON, property_name: String, value: JSON): [Json_ObjectSetProperty_Entity!]! +} + +"Saves an object as JSON file" +type Json_SaveJson_Entity implements Base_Named_Component & Entity & File_File_Component & Json_SaveJson_Component & Trigger_Action_Component { + _c__base__named: ID + _c__file__file: ID + _c__json__save_json: ID + _c__trigger__action: ID + "The filename" + filename: String + id: ID! + "The name of an entity or a relation" + name: String + payload: JSON + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Json_SaveJson_Entity_Mutations { + delete: [ID!]! + trigger: [Json_SaveJson_Entity!]! + update(filename: String, name: String, payload: JSON, trigger: Boolean): [Json_SaveJson_Entity!]! +} + +"Mutations for entities and relations on the namespace Logical" +type LogicalMutations { + "AND" + and(id: ID, ids: [ID!], label: String, lhs: Boolean, result: Boolean, rhs: Boolean): Logical_And_Entity_Mutations! + "An AND Gate with three inputs" + and3(id: ID, ids: [ID!], input1: Boolean, input2: Boolean, input3: Boolean, label: String, result: Boolean): Logical_And3_Entity_Mutations! + createAnd(id: ID, lhs: Boolean!, result: Boolean, rhs: Boolean!): Logical_And_Entity! + createAnd3(id: ID, input1: Boolean!, input2: Boolean!, input3: Boolean!, result: Boolean): Logical_And3_Entity! + createIfThenElse(condition: Boolean!, else_payload: JSON!, id: ID, result: JSON, then_payload: JSON!): Logical_IfThenElse_Entity! + createNand(id: ID, lhs: Boolean!, result: Boolean, rhs: Boolean!): Logical_Nand_Entity! + createNor(id: ID, lhs: Boolean!, result: Boolean, rhs: Boolean!): Logical_Nor_Entity! + createNot(id: ID, lhs: Boolean!, result: Boolean): Logical_Not_Entity! + createOr(id: ID, lhs: Boolean!, result: Boolean, rhs: Boolean!): Logical_Or_Entity! + createToggle(id: ID, result: Boolean, trigger: Boolean!): Logical_Toggle_Entity! + createTrigger(id: ID, payload: JSON!, trigger: Boolean!): Logical_Trigger_Entity! + createXnor(id: ID, lhs: Boolean!, result: Boolean, rhs: Boolean!): Logical_Xnor_Entity! + createXor(id: ID, lhs: Boolean!, result: Boolean, rhs: Boolean!): Logical_Xor_Entity! + "Each time it's triggered, either the then-payload or the else-payload gets propagated" + ifThenElse(condition: Boolean, else_payload: JSON, id: ID, ids: [ID!], label: String, result: JSON, then_payload: JSON): Logical_IfThenElse_Entity_Mutations! + "NAND" + nand(id: ID, ids: [ID!], label: String, lhs: Boolean, result: Boolean, rhs: Boolean): Logical_Nand_Entity_Mutations! + "NOR" + nor(id: ID, ids: [ID!], label: String, lhs: Boolean, result: Boolean, rhs: Boolean): Logical_Nor_Entity_Mutations! + "NOT" + not(id: ID, ids: [ID!], label: String, lhs: Boolean, result: Boolean): Logical_Not_Entity_Mutations! + "OR" + or(id: ID, ids: [ID!], label: String, lhs: Boolean, result: Boolean, rhs: Boolean): Logical_Or_Entity_Mutations! + "If triggered the state will toggled" + toggle(id: ID, ids: [ID!], label: String, result: Boolean, trigger: Boolean): Logical_Toggle_Entity_Mutations! + "If triggered the payload will be copied to the output" + trigger(id: ID, ids: [ID!], label: String, payload: JSON, trigger: Boolean): Logical_Trigger_Entity_Mutations! + "XNOR" + xnor(id: ID, ids: [ID!], label: String, lhs: Boolean, result: Boolean, rhs: Boolean): Logical_Xnor_Entity_Mutations! + "XOR" + xor(id: ID, ids: [ID!], label: String, lhs: Boolean, result: Boolean, rhs: Boolean): Logical_Xor_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Logical" +type LogicalNamespace { + "AND" + and(id: String, label: String, lhs: Boolean, result: Boolean, rhs: Boolean): [Logical_And_Entity!]! + "An AND Gate with three inputs" + and3(id: String, input1: Boolean, input2: Boolean, input3: Boolean, label: String, result: Boolean): [Logical_And3_Entity!]! + "Depending on the given condition outputs a result" + conditionComponent: [Logical_Condition_Component!]! + "Each time it's triggered, either the then-payload or the else-payload gets propagated" + ifThenElse(condition: Boolean, else_payload: JSON, id: String, label: String, result: JSON, then_payload: JSON): [Logical_IfThenElse_Entity!]! + "Executes a logical operation on the inputs lhs and rhs and outputs the result" + logicalGateComponent: [Logical_LogicalGate_Component!]! + "Executes a logical operation on the input lhs and outputs the result" + logicalOperationComponent: [Logical_LogicalOperation_Component!]! + "NAND" + nand(id: String, label: String, lhs: Boolean, result: Boolean, rhs: Boolean): [Logical_Nand_Entity!]! + "NOR" + nor(id: String, label: String, lhs: Boolean, result: Boolean, rhs: Boolean): [Logical_Nor_Entity!]! + "NOT" + not(id: String, label: String, lhs: Boolean, result: Boolean): [Logical_Not_Entity!]! + "OR" + or(id: String, label: String, lhs: Boolean, result: Boolean, rhs: Boolean): [Logical_Or_Entity!]! + "If triggered the state will toggled" + toggle(id: String, label: String, result: Boolean, trigger: Boolean): [Logical_Toggle_Entity!]! + "If triggered the payload will be copied to the output" + trigger(id: String, label: String, payload: JSON, trigger: Boolean): [Logical_Trigger_Entity!]! + "XNOR" + xnor(id: String, label: String, lhs: Boolean, result: Boolean, rhs: Boolean): [Logical_Xnor_Entity!]! + "XOR" + xor(id: String, label: String, lhs: Boolean, result: Boolean, rhs: Boolean): [Logical_Xor_Entity!]! +} + +"An AND Gate with three inputs" +type Logical_And3_Entity implements Entity { + id: ID! + input1: Boolean + input2: Boolean + input3: Boolean + result: Boolean +} + +type Logical_And3_Entity_Mutations { + delete: [ID!]! + update(input1: Boolean, input2: Boolean, input3: Boolean): [Logical_And3_Entity!]! +} + +"AND" +type Logical_And_Entity implements Entity & Logical_LogicalGate_Component { + _c__logical__logical_gate: ID + id: ID! + lhs: Boolean + result: Boolean + rhs: Boolean +} + +type Logical_And_Entity_Mutations { + delete: [ID!]! + update(lhs: Boolean, rhs: Boolean): [Logical_And_Entity!]! +} + +"Each time it's triggered, either the then-payload or the else-payload gets propagated" +type Logical_IfThenElse_Entity implements Entity & Logical_Condition_Component { + _c__logical__condition: ID + "A boolean condition" + condition: Boolean + "If the condition is false, the else_payload gets propagated" + else_payload: JSON + id: ID! + "The result" + result: JSON + "If the condition is true, the then_payload gets propagated" + then_payload: JSON +} + +type Logical_IfThenElse_Entity_Mutations { + delete: [ID!]! + update(condition: Boolean, else_payload: JSON, then_payload: JSON): [Logical_IfThenElse_Entity!]! +} + +"NAND" +type Logical_Nand_Entity implements Entity & Logical_LogicalGate_Component { + _c__logical__logical_gate: ID + id: ID! + lhs: Boolean + result: Boolean + rhs: Boolean +} + +type Logical_Nand_Entity_Mutations { + delete: [ID!]! + update(lhs: Boolean, rhs: Boolean): [Logical_Nand_Entity!]! +} + +"NOR" +type Logical_Nor_Entity implements Entity & Logical_LogicalGate_Component { + _c__logical__logical_gate: ID + id: ID! + lhs: Boolean + result: Boolean + rhs: Boolean +} + +type Logical_Nor_Entity_Mutations { + delete: [ID!]! + update(lhs: Boolean, rhs: Boolean): [Logical_Nor_Entity!]! +} + +"NOT" +type Logical_Not_Entity implements Entity & Logical_LogicalOperation_Component { + _c__logical__logical_operation: ID + id: ID! + lhs: Boolean + result: Boolean +} + +type Logical_Not_Entity_Mutations { + delete: [ID!]! + update(lhs: Boolean): [Logical_Not_Entity!]! +} + +"OR" +type Logical_Or_Entity implements Entity & Logical_LogicalGate_Component { + _c__logical__logical_gate: ID + id: ID! + lhs: Boolean + result: Boolean + rhs: Boolean +} + +type Logical_Or_Entity_Mutations { + delete: [ID!]! + update(lhs: Boolean, rhs: Boolean): [Logical_Or_Entity!]! +} + +"If triggered the state will toggled" +type Logical_Toggle_Entity implements Entity & Result_ResultBoolean_Component & Trigger_Action_Component { + _c__result__result_boolean: ID + _c__trigger__action: ID + id: ID! + "The result" + result: Boolean + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Logical_Toggle_Entity_Mutations { + delete: [ID!]! + trigger: [Logical_Toggle_Entity!]! + update(trigger: Boolean): [Logical_Toggle_Entity!]! +} + +"If triggered the payload will be copied to the output" +type Logical_Trigger_Entity implements Entity & Trigger_Action_Component { + _c__trigger__action: ID + id: ID! + payload: JSON + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Logical_Trigger_Entity_Mutations { + delete: [ID!]! + trigger: [Logical_Trigger_Entity!]! + update(payload: JSON, trigger: Boolean): [Logical_Trigger_Entity!]! +} + +"XNOR" +type Logical_Xnor_Entity implements Entity & Logical_LogicalGate_Component { + _c__logical__logical_gate: ID + id: ID! + lhs: Boolean + result: Boolean + rhs: Boolean +} + +type Logical_Xnor_Entity_Mutations { + delete: [ID!]! + update(lhs: Boolean, rhs: Boolean): [Logical_Xnor_Entity!]! +} + +"XOR" +type Logical_Xor_Entity implements Entity & Logical_LogicalGate_Component { + _c__logical__logical_gate: ID + id: ID! + lhs: Boolean + result: Boolean + rhs: Boolean +} + +type Logical_Xor_Entity_Mutations { + delete: [ID!]! + update(lhs: Boolean, rhs: Boolean): [Logical_Xor_Entity!]! +} + +"Queries for components, entities and relations on the namespace Metadata" +type MetadataNamespace { + dublinCoreComponent: [Metadata_DublinCore_Component!]! + id3Component: [Metadata_Id3_Component!]! +} + +"Mutations" +type Mutation { + arithmeticF64: ArithmeticF64Mutations! + arithmeticI64: ArithmeticI64Mutations! + arithmeticU64: ArithmeticU64Mutations! + base: BaseMutations! + binary: BinaryMutations! + color: ColorMutations! + comparison: ComparisonMutations! + config: ConfigMutations! + connector: ConnectorMutations! + core: CoreMutations! + dateTime: DateTimeMutations! + flow: FlowMutations! + git: GitMutations! + http: HttpMutations! + json: JsonMutations! + logical: LogicalMutations! + numericF64: NumericF64Mutations! + numericI64: NumericI64Mutations! + random: RandomMutations! + state: StateMutations! + string: StringMutations! + system: SystemMutations! + taxonomy: TaxonomyMutations! + value: ValueMutations! +} + +"Mutations for entities and relations on the namespace NumericF64" +type NumericF64Mutations { + "Computes the absolute value" + abs(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Abs_Entity_Mutations! + "Computes the arccosine of a number" + acos(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Acos_Entity_Mutations! + "Inverse hyperbolic cosine function" + acosh(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Acosh_Entity_Mutations! + "Computes the arcsine of a number" + asin(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Asin_Entity_Mutations! + "Inverse hyperbolic sine function" + asinh(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Asinh_Entity_Mutations! + "Computes the arctangent of a number" + atan(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Atan_Entity_Mutations! + "Computes the four quadrant arctangent in radians" + atan2(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): NumericF64_Atan2_Entity_Mutations! + "Inverse hyperbolic tangent function" + atanh(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Atanh_Entity_Mutations! + "Returns the cube root of a number" + cbrt(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Cbrt_Entity_Mutations! + "Returns the smallest integer greater than or equal to a number" + ceil(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Ceil_Entity_Mutations! + "Computes the cosine of a number (in radians)" + cos(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Cos_Entity_Mutations! + "Hyperbolic cosine function" + cosh(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Cosh_Entity_Mutations! + createAbs(id: ID, lhs: Float!, result: Float): NumericF64_Abs_Entity! + createAcos(id: ID, lhs: Float!, result: Float): NumericF64_Acos_Entity! + createAcosh(id: ID, lhs: Float!, result: Float): NumericF64_Acosh_Entity! + createAsin(id: ID, lhs: Float!, result: Float): NumericF64_Asin_Entity! + createAsinh(id: ID, lhs: Float!, result: Float): NumericF64_Asinh_Entity! + createAtan(id: ID, lhs: Float!, result: Float): NumericF64_Atan_Entity! + createAtan2(id: ID, lhs: Float!, result: Float!, rhs: Float!): NumericF64_Atan2_Entity! + createAtanh(id: ID, lhs: Float!, result: Float): NumericF64_Atanh_Entity! + createCbrt(id: ID, lhs: Float!, result: Float): NumericF64_Cbrt_Entity! + createCeil(id: ID, lhs: Float!, result: Float): NumericF64_Ceil_Entity! + createCos(id: ID, lhs: Float!, result: Float): NumericF64_Cos_Entity! + createCosh(id: ID, lhs: Float!, result: Float): NumericF64_Cosh_Entity! + createExp(id: ID, lhs: Float!, result: Float): NumericF64_Exp_Entity! + createExp2(id: ID, lhs: Float!, result: Float): NumericF64_Exp2_Entity! + createFloor(id: ID, lhs: Float!, result: Float): NumericF64_Floor_Entity! + createFract(id: ID, lhs: Float!, result: Float): NumericF64_Fract_Entity! + createHypot(id: ID, lhs: Float!, result: Float!, rhs: Float!): NumericF64_Hypot_Entity! + createLn(id: ID, lhs: Float!, result: Float): NumericF64_Ln_Entity! + createLog(id: ID, lhs: Float!, result: Float!, rhs: Float!): NumericF64_Log_Entity! + createLog10(id: ID, lhs: Float!, result: Float): NumericF64_Log10_Entity! + createLog2(id: ID, lhs: Float!, result: Float): NumericF64_Log2_Entity! + createPow(id: ID, lhs: Float!, result: Float!, rhs: Float!): NumericF64_Pow_Entity! + createRecip(id: ID, lhs: Float!, result: Float): NumericF64_Recip_Entity! + createRound(id: ID, lhs: Float!, result: Float): NumericF64_Round_Entity! + createSignum(id: ID, lhs: Float!, result: Float): NumericF64_Signum_Entity! + createSin(id: ID, lhs: Float!, result: Float): NumericF64_Sin_Entity! + createSinh(id: ID, lhs: Float!, result: Float): NumericF64_Sinh_Entity! + createSqrt(id: ID, lhs: Float!, result: Float): NumericF64_Sqrt_Entity! + createTan(id: ID, lhs: Float!, result: Float): NumericF64_Tan_Entity! + createTanh(id: ID, lhs: Float!, result: Float): NumericF64_Tanh_Entity! + createToDegrees(id: ID, lhs: Float!, result: Float): NumericF64_ToDegrees_Entity! + createToRadians(id: ID, lhs: Float!, result: Float): NumericF64_ToRadians_Entity! + createTrunc(id: ID, lhs: Float!, result: Float): NumericF64_Trunc_Entity! + "Returns e^(input), (the exponential function)" + exp(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Exp_Entity_Mutations! + "Returns 2^(input)" + exp2(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Exp2_Entity_Mutations! + "Returns the largest integer less than or equal to a number" + floor(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Floor_Entity_Mutations! + "Returns the fractional part of a number" + fract(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Fract_Entity_Mutations! + "Calculates the length of the hypotenuse of a right-angle triangle given legs of length x and y" + hypot(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): NumericF64_Hypot_Entity_Mutations! + "Returns the natural logarithm of the number" + ln(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Ln_Entity_Mutations! + "Returns the logarithm of the number with respect to an arbitrary base" + log(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): NumericF64_Log_Entity_Mutations! + "Returns the base 10 logarithm of the number" + log10(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Log10_Entity_Mutations! + "Returns the base 2 logarithm of the number" + log2(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Log2_Entity_Mutations! + "Raises a number to a power" + pow(id: ID, ids: [ID!], label: String, lhs: Float, result: Float, rhs: Float): NumericF64_Pow_Entity_Mutations! + "Takes the reciprocal (inverse) of a number, 1/x" + recip(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Recip_Entity_Mutations! + "Returns the nearest integer to a number. Round half-way cases away from 0.0" + round(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Round_Entity_Mutations! + "Returns a number that represents the sign of the input" + signum(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Signum_Entity_Mutations! + "Computes the sine of a number (in radians)" + sin(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Sin_Entity_Mutations! + "Hyperbolic sine function" + sinh(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Sinh_Entity_Mutations! + "Returns the square root of a number" + sqrt(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Sqrt_Entity_Mutations! + "Computes the tangent of a number (in radians)" + tan(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Tan_Entity_Mutations! + "Hyperbolic tangent function" + tanh(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Tanh_Entity_Mutations! + "Converts radians to degrees" + toDegrees(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_ToDegrees_Entity_Mutations! + "Converts degrees to radians" + toRadians(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_ToRadians_Entity_Mutations! + "Returns the integer part of a number" + trunc(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericF64_Trunc_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace NumericF64" +type NumericF64Namespace { + "Computes the absolute value" + abs(id: String, label: String, lhs: Float, result: Float): [NumericF64_Abs_Entity!]! + "Computes the arccosine of a number" + acos(id: String, label: String, lhs: Float, result: Float): [NumericF64_Acos_Entity!]! + "Inverse hyperbolic cosine function" + acosh(id: String, label: String, lhs: Float, result: Float): [NumericF64_Acosh_Entity!]! + "Computes the arcsine of a number" + asin(id: String, label: String, lhs: Float, result: Float): [NumericF64_Asin_Entity!]! + "Inverse hyperbolic sine function" + asinh(id: String, label: String, lhs: Float, result: Float): [NumericF64_Asinh_Entity!]! + "Computes the arctangent of a number" + atan(id: String, label: String, lhs: Float, result: Float): [NumericF64_Atan_Entity!]! + "Computes the four quadrant arctangent in radians" + atan2(id: String, label: String, lhs: Float, result: Float, rhs: Float): [NumericF64_Atan2_Entity!]! + "Inverse hyperbolic tangent function" + atanh(id: String, label: String, lhs: Float, result: Float): [NumericF64_Atanh_Entity!]! + "Returns the cube root of a number" + cbrt(id: String, label: String, lhs: Float, result: Float): [NumericF64_Cbrt_Entity!]! + "Returns the smallest integer greater than or equal to a number" + ceil(id: String, label: String, lhs: Float, result: Float): [NumericF64_Ceil_Entity!]! + "Computes the cosine of a number (in radians)" + cos(id: String, label: String, lhs: Float, result: Float): [NumericF64_Cos_Entity!]! + "Hyperbolic cosine function" + cosh(id: String, label: String, lhs: Float, result: Float): [NumericF64_Cosh_Entity!]! + "Returns e^(input), (the exponential function)" + exp(id: String, label: String, lhs: Float, result: Float): [NumericF64_Exp_Entity!]! + "Returns 2^(input)" + exp2(id: String, label: String, lhs: Float, result: Float): [NumericF64_Exp2_Entity!]! + "Returns the largest integer less than or equal to a number" + floor(id: String, label: String, lhs: Float, result: Float): [NumericF64_Floor_Entity!]! + "Returns the fractional part of a number" + fract(id: String, label: String, lhs: Float, result: Float): [NumericF64_Fract_Entity!]! + "Calculates the length of the hypotenuse of a right-angle triangle given legs of length x and y" + hypot(id: String, label: String, lhs: Float, result: Float, rhs: Float): [NumericF64_Hypot_Entity!]! + "Returns the natural logarithm of the number" + ln(id: String, label: String, lhs: Float, result: Float): [NumericF64_Ln_Entity!]! + "Returns the logarithm of the number with respect to an arbitrary base" + log(id: String, label: String, lhs: Float, result: Float, rhs: Float): [NumericF64_Log_Entity!]! + "Returns the base 10 logarithm of the number" + log10(id: String, label: String, lhs: Float, result: Float): [NumericF64_Log10_Entity!]! + "Returns the base 2 logarithm of the number" + log2(id: String, label: String, lhs: Float, result: Float): [NumericF64_Log2_Entity!]! + "Raises a number to a power" + pow(id: String, label: String, lhs: Float, result: Float, rhs: Float): [NumericF64_Pow_Entity!]! + "Takes the reciprocal (inverse) of a number, 1/x" + recip(id: String, label: String, lhs: Float, result: Float): [NumericF64_Recip_Entity!]! + "Returns the nearest integer to a number. Round half-way cases away from 0.0" + round(id: String, label: String, lhs: Float, result: Float): [NumericF64_Round_Entity!]! + "Returns a number that represents the sign of the input" + signum(id: String, label: String, lhs: Float, result: Float): [NumericF64_Signum_Entity!]! + "Computes the sine of a number (in radians)" + sin(id: String, label: String, lhs: Float, result: Float): [NumericF64_Sin_Entity!]! + "Hyperbolic sine function" + sinh(id: String, label: String, lhs: Float, result: Float): [NumericF64_Sinh_Entity!]! + "Returns the square root of a number" + sqrt(id: String, label: String, lhs: Float, result: Float): [NumericF64_Sqrt_Entity!]! + "Computes the tangent of a number (in radians)" + tan(id: String, label: String, lhs: Float, result: Float): [NumericF64_Tan_Entity!]! + "Hyperbolic tangent function" + tanh(id: String, label: String, lhs: Float, result: Float): [NumericF64_Tanh_Entity!]! + "Converts radians to degrees" + toDegrees(id: String, label: String, lhs: Float, result: Float): [NumericF64_ToDegrees_Entity!]! + "Converts degrees to radians" + toRadians(id: String, label: String, lhs: Float, result: Float): [NumericF64_ToRadians_Entity!]! + "Returns the integer part of a number" + trunc(id: String, label: String, lhs: Float, result: Float): [NumericF64_Trunc_Entity!]! +} + +"Computes the absolute value" +type NumericF64_Abs_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Abs_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Abs_Entity!]! +} + +"Computes the arccosine of a number" +type NumericF64_Acos_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Acos_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Acos_Entity!]! +} + +"Inverse hyperbolic cosine function" +type NumericF64_Acosh_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Acosh_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Acosh_Entity!]! +} + +"Computes the arcsine of a number" +type NumericF64_Asin_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Asin_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Asin_Entity!]! +} + +"Inverse hyperbolic sine function" +type NumericF64_Asinh_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Asinh_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Asinh_Entity!]! +} + +"Computes the four quadrant arctangent in radians" +type NumericF64_Atan2_Entity implements Entity & Numeric_NumericGate_Component { + _c__numeric__numeric_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type NumericF64_Atan2_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, result: Float, rhs: Float): [NumericF64_Atan2_Entity!]! +} + +"Computes the arctangent of a number" +type NumericF64_Atan_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Atan_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Atan_Entity!]! +} + +"Inverse hyperbolic tangent function" +type NumericF64_Atanh_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Atanh_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Atanh_Entity!]! +} + +"Returns the cube root of a number" +type NumericF64_Cbrt_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Cbrt_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Cbrt_Entity!]! +} + +"Returns the smallest integer greater than or equal to a number" +type NumericF64_Ceil_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Ceil_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Ceil_Entity!]! +} + +"Computes the cosine of a number (in radians)" +type NumericF64_Cos_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Cos_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Cos_Entity!]! +} + +"Hyperbolic cosine function" +type NumericF64_Cosh_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Cosh_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Cosh_Entity!]! +} + +"Returns 2^(input)" +type NumericF64_Exp2_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Exp2_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Exp2_Entity!]! +} + +"Returns e^(input), (the exponential function)" +type NumericF64_Exp_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Exp_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Exp_Entity!]! +} + +"Returns the largest integer less than or equal to a number" +type NumericF64_Floor_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Floor_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Floor_Entity!]! +} + +"Returns the fractional part of a number" +type NumericF64_Fract_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Fract_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Fract_Entity!]! +} + +"Calculates the length of the hypotenuse of a right-angle triangle given legs of length x and y" +type NumericF64_Hypot_Entity implements Entity & Numeric_NumericGate_Component { + _c__numeric__numeric_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type NumericF64_Hypot_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, result: Float, rhs: Float): [NumericF64_Hypot_Entity!]! +} + +"Returns the natural logarithm of the number" +type NumericF64_Ln_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Ln_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Ln_Entity!]! +} + +"Returns the base 10 logarithm of the number" +type NumericF64_Log10_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Log10_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Log10_Entity!]! +} + +"Returns the base 2 logarithm of the number" +type NumericF64_Log2_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Log2_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Log2_Entity!]! +} + +"Returns the logarithm of the number with respect to an arbitrary base" +type NumericF64_Log_Entity implements Entity & Numeric_NumericGate_Component { + _c__numeric__numeric_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type NumericF64_Log_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, result: Float, rhs: Float): [NumericF64_Log_Entity!]! +} + +"Raises a number to a power" +type NumericF64_Pow_Entity implements Entity & Numeric_NumericGate_Component { + _c__numeric__numeric_gate: ID + id: ID! + lhs: Float + result: Float + rhs: Float +} + +type NumericF64_Pow_Entity_Mutations { + delete: [ID!]! + update(lhs: Float, result: Float, rhs: Float): [NumericF64_Pow_Entity!]! +} + +"Takes the reciprocal (inverse) of a number, 1/x" +type NumericF64_Recip_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Recip_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Recip_Entity!]! +} + +"Returns the nearest integer to a number. Round half-way cases away from 0.0" +type NumericF64_Round_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Round_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Round_Entity!]! +} + +"Returns a number that represents the sign of the input" +type NumericF64_Signum_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Signum_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Signum_Entity!]! +} + +"Computes the sine of a number (in radians)" +type NumericF64_Sin_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Sin_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Sin_Entity!]! +} + +"Hyperbolic sine function" +type NumericF64_Sinh_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Sinh_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Sinh_Entity!]! +} + +"Returns the square root of a number" +type NumericF64_Sqrt_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Sqrt_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Sqrt_Entity!]! +} + +"Computes the tangent of a number (in radians)" +type NumericF64_Tan_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Tan_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Tan_Entity!]! +} + +"Hyperbolic tangent function" +type NumericF64_Tanh_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Tanh_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Tanh_Entity!]! +} + +"Converts radians to degrees" +type NumericF64_ToDegrees_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_ToDegrees_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_ToDegrees_Entity!]! +} + +"Converts degrees to radians" +type NumericF64_ToRadians_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_ToRadians_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_ToRadians_Entity!]! +} + +"Returns the integer part of a number" +type NumericF64_Trunc_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericF64_Trunc_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericF64_Trunc_Entity!]! +} + +"Mutations for entities and relations on the namespace NumericI64" +type NumericI64Mutations { + "Computes the absolute value" + abs(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericI64_Abs_Entity_Mutations! + createAbs(id: ID, lhs: Float!, result: Float): NumericI64_Abs_Entity! + createSignum(id: ID, lhs: Float!, result: Float): NumericI64_Signum_Entity! + "Returns a number that represents the sign of the input" + signum(id: ID, ids: [ID!], label: String, lhs: Float, result: Float): NumericI64_Signum_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace NumericI64" +type NumericI64Namespace { + "Computes the absolute value" + abs(id: String, label: String, lhs: Float, result: Float): [NumericI64_Abs_Entity!]! + "Returns a number that represents the sign of the input" + signum(id: String, label: String, lhs: Float, result: Float): [NumericI64_Signum_Entity!]! +} + +"Computes the absolute value" +type NumericI64_Abs_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericI64_Abs_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericI64_Abs_Entity!]! +} + +"Returns a number that represents the sign of the input" +type NumericI64_Signum_Entity implements Entity & Numeric_NumericOperation_Component { + _c__numeric__numeric_operation: ID + id: ID! + lhs: Float + result: Float +} + +type NumericI64_Signum_Entity_Mutations { + delete: [ID!]! + update(lhs: Float): [NumericI64_Signum_Entity!]! +} + +"Queries for components, entities and relations on the namespace Numeric" +type NumericNamespace { + numericGateComponent: [Numeric_NumericGate_Component!]! + numericOperationComponent: [Numeric_NumericOperation_Component!]! +} + +"Queries" +type Query { + arithmetic: ArithmeticNamespace! + arithmeticF64: ArithmeticF64Namespace! + arithmeticI64: ArithmeticI64Namespace! + arithmeticU64: ArithmeticU64Namespace! + base: BaseNamespace! + binary: BinaryNamespace! + color: ColorNamespace! + comparison: ComparisonNamespace! + config: ConfigNamespace! + connector: ConnectorNamespace! + core: CoreNamespace! + dateTime: DateTimeNamespace! + file: FileNamespace! + flow: FlowNamespace! + git: GitNamespace! + http: HttpNamespace! + json: JsonNamespace! + logical: LogicalNamespace! + metadata: MetadataNamespace! + numeric: NumericNamespace! + numericF64: NumericF64Namespace! + numericI64: NumericI64Namespace! + random: RandomNamespace! + result: ResultNamespace! + state: StateNamespace! + string: StringNamespace! + system: SystemNamespace! + taxonomy: TaxonomyNamespace! + trigger: TriggerNamespace! + value: ValueNamespace! +} + +"Mutations for entities and relations on the namespace Random" +type RandomMutations { + createRandomBool(id: ID, result: Boolean, trigger: Boolean!): Random_RandomBool_Entity! + createRandomF64(id: ID, result: Float, trigger: Boolean!): Random_RandomF64_Entity! + createRandomF64Pseudo(id: ID, result: Float, seed: Float!, trigger: Boolean!): Random_RandomF64Pseudo_Entity! + createRandomF64Range(high: Float!, id: ID, low: Float!, result: Float, trigger: Boolean!): Random_RandomF64Range_Entity! + createRandomI64(id: ID, result: Float, trigger: Boolean!): Random_RandomI64_Entity! + createRandomI64Pseudo(id: ID, result: Float, seed: Float!, trigger: Boolean!): Random_RandomI64Pseudo_Entity! + createRandomI64Range(high: Float!, id: ID, low: Float!, result: Float, trigger: Boolean!): Random_RandomI64Range_Entity! + createRandomString(id: ID, length: Float!, result: String, trigger: Boolean!): Random_RandomString_Entity! + createRandomU64(id: ID, result: Float, trigger: Boolean!): Random_RandomU64_Entity! + createRandomU64Pseudo(id: ID, result: Float, seed: Float!, trigger: Boolean!): Random_RandomU64Pseudo_Entity! + createRandomU64Range(high: Float!, id: ID, low: Float!, result: Float, trigger: Boolean!): Random_RandomU64Range_Entity! + createRandomUuid(id: ID, result: String, trigger: Boolean!): Random_RandomUuid_Entity! + "Random Bool" + randomBool(id: ID, ids: [ID!], label: String, result: Boolean, trigger: Boolean): Random_RandomBool_Entity_Mutations! + "Random Floating Point Number" + randomF64(id: ID, ids: [ID!], label: String, result: Float, trigger: Boolean): Random_RandomF64_Entity_Mutations! + "Pseudo Random Floating Point Number" + randomF64Pseudo(id: ID, ids: [ID!], label: String, result: Float, seed: Float, trigger: Boolean): Random_RandomF64Pseudo_Entity_Mutations! + "Random Floating Point Number Within Range" + randomF64Range(high: Float, id: ID, ids: [ID!], label: String, low: Float, result: Float, trigger: Boolean): Random_RandomF64Range_Entity_Mutations! + "Random Signed Integer Number" + randomI64(id: ID, ids: [ID!], label: String, result: Float, trigger: Boolean): Random_RandomI64_Entity_Mutations! + "Pseudo Random Signed Integer Number" + randomI64Pseudo(id: ID, ids: [ID!], label: String, result: Float, seed: Float, trigger: Boolean): Random_RandomI64Pseudo_Entity_Mutations! + "Random Signed Integer Within Range" + randomI64Range(high: Float, id: ID, ids: [ID!], label: String, low: Float, result: Float, trigger: Boolean): Random_RandomI64Range_Entity_Mutations! + "Random String" + randomString(id: ID, ids: [ID!], label: String, length: Float, result: String, trigger: Boolean): Random_RandomString_Entity_Mutations! + "Random Unsigned Integer Number" + randomU64(id: ID, ids: [ID!], label: String, result: Float, trigger: Boolean): Random_RandomU64_Entity_Mutations! + "Pseudo Random Unsigned Integer Number" + randomU64Pseudo(id: ID, ids: [ID!], label: String, result: Float, seed: Float, trigger: Boolean): Random_RandomU64Pseudo_Entity_Mutations! + "Random Unsigned Integer Within Range" + randomU64Range(high: Float, id: ID, ids: [ID!], label: String, low: Float, result: Float, trigger: Boolean): Random_RandomU64Range_Entity_Mutations! + "Random UUID" + randomUuid(id: ID, ids: [ID!], label: String, result: String, trigger: Boolean): Random_RandomUuid_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Random" +type RandomNamespace { + "Pseudo Number Generator" + pseudoNumberGeneratorComponent: [Random_PseudoNumberGenerator_Component!]! + "Random Bool" + randomBool(id: String, label: String, result: Boolean, trigger: Boolean): [Random_RandomBool_Entity!]! + "Random Floating Point Number" + randomF64(id: String, label: String, result: Float, trigger: Boolean): [Random_RandomF64_Entity!]! + "Pseudo Random Floating Point Number" + randomF64Pseudo(id: String, label: String, result: Float, seed: Float, trigger: Boolean): [Random_RandomF64Pseudo_Entity!]! + "Random Floating Point Number Within Range" + randomF64Range(high: Float, id: String, label: String, low: Float, result: Float, trigger: Boolean): [Random_RandomF64Range_Entity!]! + "Random Signed Integer Number" + randomI64(id: String, label: String, result: Float, trigger: Boolean): [Random_RandomI64_Entity!]! + "Pseudo Random Signed Integer Number" + randomI64Pseudo(id: String, label: String, result: Float, seed: Float, trigger: Boolean): [Random_RandomI64Pseudo_Entity!]! + "Random Signed Integer Within Range" + randomI64Range(high: Float, id: String, label: String, low: Float, result: Float, trigger: Boolean): [Random_RandomI64Range_Entity!]! + "Random String" + randomString(id: String, label: String, length: Float, result: String, trigger: Boolean): [Random_RandomString_Entity!]! + "Random Unsigned Integer Number" + randomU64(id: String, label: String, result: Float, trigger: Boolean): [Random_RandomU64_Entity!]! + "Pseudo Random Unsigned Integer Number" + randomU64Pseudo(id: String, label: String, result: Float, seed: Float, trigger: Boolean): [Random_RandomU64Pseudo_Entity!]! + "Random Unsigned Integer Within Range" + randomU64Range(high: Float, id: String, label: String, low: Float, result: Float, trigger: Boolean): [Random_RandomU64Range_Entity!]! + "Random UUID" + randomUuid(id: String, label: String, result: String, trigger: Boolean): [Random_RandomUuid_Entity!]! + "Range" + rangeComponent: [Random_Range_Component!]! +} + +"Random Bool" +type Random_RandomBool_Entity implements Entity & Result_ResultBoolean_Component & Trigger_Action_Component { + _c__result__result_boolean: ID + _c__trigger__action: ID + id: ID! + "The result" + result: Boolean + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomBool_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomBool_Entity!]! + update(trigger: Boolean): [Random_RandomBool_Entity!]! +} + +"Pseudo Random Floating Point Number" +type Random_RandomF64Pseudo_Entity implements Entity & Random_PseudoNumberGenerator_Component & Result_ResultNumber_Component & Trigger_Action_Component { + _c__random__pseudo_number_generator: ID + _c__result__result_number: ID + _c__trigger__action: ID + id: ID! + "The result" + result: Float + seed: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomF64Pseudo_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomF64Pseudo_Entity!]! + update(seed: Float, trigger: Boolean): [Random_RandomF64Pseudo_Entity!]! +} + +"Random Floating Point Number Within Range" +type Random_RandomF64Range_Entity implements Entity & Random_Range_Component & Result_ResultNumber_Component & Trigger_Action_Component { + _c__random__range: ID + _c__result__result_number: ID + _c__trigger__action: ID + high: Float + id: ID! + low: Float + "The result" + result: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomF64Range_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomF64Range_Entity!]! + update(high: Float, low: Float, trigger: Boolean): [Random_RandomF64Range_Entity!]! +} + +"Random Floating Point Number" +type Random_RandomF64_Entity implements Entity & Result_ResultNumber_Component & Trigger_Action_Component { + _c__result__result_number: ID + _c__trigger__action: ID + id: ID! + "The result" + result: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomF64_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomF64_Entity!]! + update(trigger: Boolean): [Random_RandomF64_Entity!]! +} + +"Pseudo Random Signed Integer Number" +type Random_RandomI64Pseudo_Entity implements Entity & Random_PseudoNumberGenerator_Component & Result_ResultNumber_Component & Trigger_Action_Component { + _c__random__pseudo_number_generator: ID + _c__result__result_number: ID + _c__trigger__action: ID + id: ID! + "The result" + result: Float + seed: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomI64Pseudo_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomI64Pseudo_Entity!]! + update(seed: Float, trigger: Boolean): [Random_RandomI64Pseudo_Entity!]! +} + +"Random Signed Integer Within Range" +type Random_RandomI64Range_Entity implements Entity & Random_Range_Component & Result_ResultNumber_Component & Trigger_Action_Component { + _c__random__range: ID + _c__result__result_number: ID + _c__trigger__action: ID + high: Float + id: ID! + low: Float + "The result" + result: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomI64Range_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomI64Range_Entity!]! + update(high: Float, low: Float, trigger: Boolean): [Random_RandomI64Range_Entity!]! +} + +"Random Signed Integer Number" +type Random_RandomI64_Entity implements Entity & Result_ResultNumber_Component & Trigger_Action_Component { + _c__result__result_number: ID + _c__trigger__action: ID + id: ID! + "The result" + result: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomI64_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomI64_Entity!]! + update(trigger: Boolean): [Random_RandomI64_Entity!]! +} + +"Random String" +type Random_RandomString_Entity implements Entity & Result_ResultString_Component & Trigger_Action_Component { + _c__result__result_string: ID + _c__trigger__action: ID + id: ID! + length: Float + "The result" + result: String + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomString_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomString_Entity!]! + update(length: Float, trigger: Boolean): [Random_RandomString_Entity!]! +} + +"Pseudo Random Unsigned Integer Number" +type Random_RandomU64Pseudo_Entity implements Entity & Random_PseudoNumberGenerator_Component & Result_ResultNumber_Component & Trigger_Action_Component { + _c__random__pseudo_number_generator: ID + _c__result__result_number: ID + _c__trigger__action: ID + id: ID! + "The result" + result: Float + seed: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomU64Pseudo_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomU64Pseudo_Entity!]! + update(seed: Float, trigger: Boolean): [Random_RandomU64Pseudo_Entity!]! +} + +"Random Unsigned Integer Within Range" +type Random_RandomU64Range_Entity implements Entity & Random_Range_Component & Result_ResultNumber_Component & Trigger_Action_Component { + _c__random__range: ID + _c__result__result_number: ID + _c__trigger__action: ID + high: Float + id: ID! + low: Float + "The result" + result: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomU64Range_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomU64Range_Entity!]! + update(high: Float, low: Float, trigger: Boolean): [Random_RandomU64Range_Entity!]! +} + +"Random Unsigned Integer Number" +type Random_RandomU64_Entity implements Entity & Result_ResultNumber_Component & Trigger_Action_Component { + _c__result__result_number: ID + _c__trigger__action: ID + id: ID! + "The result" + result: Float + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomU64_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomU64_Entity!]! + update(trigger: Boolean): [Random_RandomU64_Entity!]! +} + +"Random UUID" +type Random_RandomUuid_Entity implements Entity & Result_ResultString_Component & Trigger_Action_Component { + _c__result__result_string: ID + _c__trigger__action: ID + id: ID! + "The result" + result: String + "On receiving a boolean trigger the action will be executed" + trigger: Boolean +} + +type Random_RandomUuid_Entity_Mutations { + delete: [ID!]! + trigger: [Random_RandomUuid_Entity!]! + update(trigger: Boolean): [Random_RandomUuid_Entity!]! +} + +"Queries for components, entities and relations on the namespace Result" +type ResultNamespace { + "The entity returns data of any datatype" + resultAnyComponent: [Result_ResultAny_Component!]! + "The entity returns an array" + resultArrayComponent: [Result_ResultArray_Component!]! + "The entity returns a boolean" + resultBooleanComponent: [Result_ResultBoolean_Component!]! + "The entity returns a number" + resultNumberComponent: [Result_ResultNumber_Component!]! + "The entity returns an object" + resultObjectComponent: [Result_ResultObject_Component!]! + "The entity returns a string" + resultStringComponent: [Result_ResultString_Component!]! +} + +"Mutations for entities and relations on the namespace State" +type StateMutations { + createStateArray(id: ID, name: String!, set_state: [JSON!]!, state: [JSON!], value: [JSON!]!): State_StateArray_Entity! + createStateBoolean(id: ID, name: String!, set_state: Boolean!, state: Boolean, value: Boolean!): State_StateBoolean_Entity! + createStateNumber(id: ID, name: String!, set_state: Float!, state: Float, value: Float!): State_StateNumber_Entity! + createStateObject(id: ID, name: String!, set_state: JSON!, state: JSON, value: JSON!): State_StateObject_Entity! + createStateString(id: ID, name: String!, set_state: String!, state: String, value: String!): State_StateString_Entity! + "State of type array" + stateArray(id: ID, ids: [ID!], label: String, name: String, set_state: [JSON!], state: [JSON!], value: [JSON!]): State_StateArray_Entity_Mutations! + "State of type boolean" + stateBoolean(id: ID, ids: [ID!], label: String, name: String, set_state: Boolean, state: Boolean, value: Boolean): State_StateBoolean_Entity_Mutations! + "State of type number" + stateNumber(id: ID, ids: [ID!], label: String, name: String, set_state: Float, state: Float, value: Float): State_StateNumber_Entity_Mutations! + "State of type object" + stateObject(id: ID, ids: [ID!], label: String, name: String, set_state: JSON, state: JSON, value: JSON): State_StateObject_Entity_Mutations! + "State of type string" + stateString(id: ID, ids: [ID!], label: String, name: String, set_state: String, state: String, value: String): State_StateString_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace State" +type StateNamespace { + "State of type array" + stateArray(id: String, label: String, name: String, set_state: [JSON!], state: [JSON!], value: [JSON!]): [State_StateArray_Entity!]! + "State of type array" + stateArrayComponent: [State_StateArray_Component!]! + "State of type boolean" + stateBoolean(id: String, label: String, name: String, set_state: Boolean, state: Boolean, value: Boolean): [State_StateBoolean_Entity!]! + "State of type boolean" + stateBooleanComponent: [State_StateBoolean_Component!]! + stateDebuggerDebugComponent: [State_StateDebuggerDebug_Component!]! + stateDebuggerTraceComponent: [State_StateDebuggerTrace_Component!]! + "State of type number" + stateNumber(id: String, label: String, name: String, set_state: Float, state: Float, value: Float): [State_StateNumber_Entity!]! + "State of type number" + stateNumberComponent: [State_StateNumber_Component!]! + "State of type object" + stateObject(id: String, label: String, name: String, set_state: JSON, state: JSON, value: JSON): [State_StateObject_Entity!]! + "State of type object" + stateObjectComponent: [State_StateObject_Component!]! + "State of type string" + stateString(id: String, label: String, name: String, set_state: String, state: String, value: String): [State_StateString_Entity!]! + "State of type string" + stateStringComponent: [State_StateString_Component!]! +} + +"State of type array" +type State_StateArray_Entity implements Base_Named_Component & Entity & State_StateArray_Component & Value_ValueArray_Component { + _c__base__named: ID + _c__state__state_array: ID + _c__value__value_array: ID + id: ID! + "The name of an entity or a relation" + name: String + set_state: JSON + state: JSON + value: JSON +} + +type State_StateArray_Entity_Mutations { + delete: [ID!]! + update(name: String, set_state: [JSON!], value: [JSON!]): [State_StateArray_Entity!]! +} + +"State of type boolean" +type State_StateBoolean_Entity implements Base_Named_Component & Entity & State_StateBoolean_Component & Value_ValueBoolean_Component { + _c__base__named: ID + _c__state__state_boolean: ID + _c__value__value_boolean: ID + id: ID! + "The name of an entity or a relation" + name: String + set_state: Boolean + state: Boolean + value: Boolean +} + +type State_StateBoolean_Entity_Mutations { + delete: [ID!]! + update(name: String, set_state: Boolean, value: Boolean): [State_StateBoolean_Entity!]! +} + +"State of type number" +type State_StateNumber_Entity implements Base_Named_Component & Entity & State_StateNumber_Component & Value_ValueNumber_Component { + _c__base__named: ID + _c__state__state_number: ID + _c__value__value_number: ID + id: ID! + "The name of an entity or a relation" + name: String + set_state: Float + state: Float + value: Float +} + +type State_StateNumber_Entity_Mutations { + delete: [ID!]! + update(name: String, set_state: Float, value: Float): [State_StateNumber_Entity!]! +} + +"State of type object" +type State_StateObject_Entity implements Base_Named_Component & Entity & State_StateObject_Component & Value_ValueObject_Component { + _c__base__named: ID + _c__state__state_object: ID + _c__value__value_object: ID + id: ID! + "The name of an entity or a relation" + name: String + set_state: JSON + state: JSON + value: JSON +} + +type State_StateObject_Entity_Mutations { + delete: [ID!]! + update(name: String, set_state: JSON, value: JSON): [State_StateObject_Entity!]! +} + +"State of type string" +type State_StateString_Entity implements Base_Named_Component & Entity & State_StateString_Component & Value_ValueString_Component { + _c__base__named: ID + _c__state__state_string: ID + _c__value__value_string: ID + id: ID! + "The name of an entity or a relation" + name: String + set_state: String + state: String + value: String +} + +type State_StateString_Entity_Mutations { + delete: [ID!]! + update(name: String, set_state: String, value: String): [State_StateString_Entity!]! +} + +"Mutations for entities and relations on the namespace String" +type StringMutations { + "Converts the input to camel case" + camelCase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_CamelCase_Entity_Mutations! + "Converts the first character of the input to upper case and convert the rest of the input to lower case" + capitalize(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_Capitalize_Entity_Mutations! + "Counts the characters" + charCount(id: ID, ids: [ID!], label: String, lhs: String, result: Float): String_CharCount_Entity_Mutations! + "Counts the graphemes in the input string taking care of surrogate pairs and combining marks" + charCountGraphemes(id: ID, ids: [ID!], label: String, lhs: String, result: Float): String_CharCountGraphemes_Entity_Mutations! + "Returns everything after the given search" + chopAfter(id: ID, ids: [ID!], label: String, lhs: String, result: String, rhs: String): String_ChopAfter_Entity_Mutations! + "Returns everything after the last given search" + chopAfterLast(id: ID, ids: [ID!], label: String, lhs: String, result: String, rhs: String): String_ChopAfterLast_Entity_Mutations! + "Returns everything before the given search" + chopBefore(id: ID, ids: [ID!], label: String, lhs: String, result: String, rhs: String): String_ChopBefore_Entity_Mutations! + "Returns everything before the last given search" + chopBeforeLast(id: ID, ids: [ID!], label: String, lhs: String, result: String, rhs: String): String_ChopBeforeLast_Entity_Mutations! + "Extracts the prefix from the input" + chopRemovePrefix(id: ID, ids: [ID!], label: String, lhs: String, result: String, rhs: String): String_ChopRemovePrefix_Entity_Mutations! + "Extracts the suffix from the input" + chopRemoveSuffix(id: ID, ids: [ID!], label: String, lhs: String, result: String, rhs: String): String_ChopRemoveSuffix_Entity_Mutations! + "Concat" + concat(id: ID, ids: [ID!], label: String, lhs: String, result: String, rhs: String): String_Concat_Entity_Mutations! + "Contains" + contains(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean, rhs: String): String_Contains_Entity_Mutations! + "Counts the number of substring appearances in the input string" + countSubstrings(id: ID, ids: [ID!], label: String, lhs: String, result: Float, rhs: String): String_CountSubstrings_Entity_Mutations! + "Counting occurrences of unique words in the input string. This function respects unicode" + countUniqueWords(id: ID, ids: [ID!], label: String, lhs: String, result: Float, rhs: String): String_CountUniqueWords_Entity_Mutations! + "Counts the number of words in the input string" + countWords(id: ID, ids: [ID!], label: String, lhs: String, result: Float, rhs: String): String_CountWords_Entity_Mutations! + createCamelCase(id: ID, lhs: String!, result: String): String_CamelCase_Entity! + createCapitalize(id: ID, lhs: String!, result: String): String_Capitalize_Entity! + createCharCount(id: ID, lhs: String!, result: Float): String_CharCount_Entity! + createCharCountGraphemes(id: ID, lhs: String!, result: Float): String_CharCountGraphemes_Entity! + createChopAfter(id: ID, lhs: String!, result: String, rhs: String!): String_ChopAfter_Entity! + createChopAfterLast(id: ID, lhs: String!, result: String, rhs: String!): String_ChopAfterLast_Entity! + createChopBefore(id: ID, lhs: String!, result: String, rhs: String!): String_ChopBefore_Entity! + createChopBeforeLast(id: ID, lhs: String!, result: String, rhs: String!): String_ChopBeforeLast_Entity! + createChopRemovePrefix(id: ID, lhs: String!, result: String, rhs: String!): String_ChopRemovePrefix_Entity! + createChopRemoveSuffix(id: ID, lhs: String!, result: String, rhs: String!): String_ChopRemoveSuffix_Entity! + createConcat(id: ID, lhs: String!, result: String, rhs: String!): String_Concat_Entity! + createContains(id: ID, lhs: String!, result: Boolean, rhs: String!): String_Contains_Entity! + createCountSubstrings(id: ID, lhs: String!, result: Float, rhs: String!): String_CountSubstrings_Entity! + createCountUniqueWords(id: ID, lhs: String!, result: Float, rhs: String!): String_CountUniqueWords_Entity! + createCountWords(id: ID, lhs: String!, result: Float, rhs: String!): String_CountWords_Entity! + createDecapitalize(id: ID, lhs: String!, result: String): String_Decapitalize_Entity! + createEndsWith(id: ID, lhs: String!, result: Boolean, rhs: String!): String_EndsWith_Entity! + createEscapeHtml(id: ID, lhs: String!, result: String): String_EscapeHtml_Entity! + createEscapeRegexp(id: ID, lhs: String!, result: String): String_EscapeRegexp_Entity! + createIsAlpha(id: ID, lhs: String!, result: Boolean): String_IsAlpha_Entity! + createIsAlphaDigit(id: ID, lhs: String!, result: Boolean): String_IsAlphaDigit_Entity! + createIsBlank(id: ID, lhs: String!, result: Boolean): String_IsBlank_Entity! + createIsCamelCase(id: ID, lhs: String!, result: Boolean): String_IsCamelCase_Entity! + createIsCapitalize(id: ID, lhs: String!, result: Boolean): String_IsCapitalize_Entity! + createIsDecapitalize(id: ID, lhs: String!, result: Boolean): String_IsDecapitalize_Entity! + createIsDigit(id: ID, lhs: String!, result: Boolean): String_IsDigit_Entity! + createIsEmpty(id: ID, lhs: String!, result: Boolean): String_IsEmpty_Entity! + createIsKebabCase(id: ID, lhs: String!, result: Boolean): String_IsKebabCase_Entity! + createIsLowerFirst(id: ID, lhs: String!, result: Boolean): String_IsLowerFirst_Entity! + createIsLowercase(id: ID, lhs: String!, result: Boolean): String_IsLowercase_Entity! + createIsNumeric(id: ID, lhs: String!, result: Boolean): String_IsNumeric_Entity! + createIsPascalCase(id: ID, lhs: String!, result: Boolean): String_IsPascalCase_Entity! + createIsShoutyKebabCase(id: ID, lhs: String!, result: Boolean): String_IsShoutyKebabCase_Entity! + createIsShoutySnakeCase(id: ID, lhs: String!, result: Boolean): String_IsShoutySnakeCase_Entity! + createIsSnakeCase(id: ID, lhs: String!, result: Boolean): String_IsSnakeCase_Entity! + createIsTitleCase(id: ID, lhs: String!, result: Boolean): String_IsTitleCase_Entity! + createIsTrainCase(id: ID, lhs: String!, result: Boolean): String_IsTrainCase_Entity! + createIsUpperFirst(id: ID, lhs: String!, result: Boolean): String_IsUpperFirst_Entity! + createIsUppercase(id: ID, lhs: String!, result: Boolean): String_IsUppercase_Entity! + createKebabCase(id: ID, lhs: String!, result: String): String_KebabCase_Entity! + createLowerFirst(id: ID, lhs: String!, result: String): String_LowerFirst_Entity! + createLowercase(id: ID, lhs: String!, result: String): String_Lowercase_Entity! + createPascalCase(id: ID, lhs: String!, result: String): String_PascalCase_Entity! + createReverse(id: ID, lhs: String!, result: String): String_Reverse_Entity! + createShoutyKebabCase(id: ID, lhs: String!, result: String): String_ShoutyKebabCase_Entity! + createShoutySnakeCase(id: ID, lhs: String!, result: String): String_ShoutySnakeCase_Entity! + createSnakeCase(id: ID, lhs: String!, result: String): String_SnakeCase_Entity! + createStartsWith(id: ID, lhs: String!, result: Boolean, rhs: String!): String_StartsWith_Entity! + createStringLength(id: ID, lhs: String!, result: Float): String_StringLength_Entity! + createStripHtmlTags(id: ID, lhs: String!, result: String): String_StripHtmlTags_Entity! + createSwapCase(id: ID, lhs: String!, result: String): String_SwapCase_Entity! + createTemplating(context: JSON!, id: ID, result: String!, template: String!): String_Templating_Entity! + createTitleCase(id: ID, lhs: String!, result: String): String_TitleCase_Entity! + createTrainCase(id: ID, lhs: String!, result: String): String_TrainCase_Entity! + createTrim(id: ID, lhs: String!, result: String): String_Trim_Entity! + createTrimEnd(id: ID, lhs: String!, result: String): String_TrimEnd_Entity! + createTrimStart(id: ID, lhs: String!, result: String): String_TrimStart_Entity! + createUnescapeHtml(id: ID, lhs: String!, result: String): String_UnescapeHtml_Entity! + createUpperFirst(id: ID, lhs: String!, result: String): String_UpperFirst_Entity! + createUppercase(id: ID, lhs: String!, result: String): String_Uppercase_Entity! + "Converts the first character of the input to lower case and convert the rest of the input to lower case" + decapitalize(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_Decapitalize_Entity_Mutations! + "Ends With" + endsWith(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean, rhs: String): String_EndsWith_Entity_Mutations! + "Escapes HTML special characters" + escapeHtml(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_EscapeHtml_Entity_Mutations! + "Escapes the regular expression special characters" + escapeRegexp(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_EscapeRegexp_Entity_Mutations! + "Checks whether the input string contains only alpha characters" + isAlpha(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsAlpha_Entity_Mutations! + "Checks whether the input string contains contains only alpha and digit characters" + isAlphaDigit(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsAlphaDigit_Entity_Mutations! + "Checks whether the input string is empty or contains only whitespaces" + isBlank(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsBlank_Entity_Mutations! + "Checks whether the input string is camelCased" + isCamelCase(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsCamelCase_Entity_Mutations! + "Checks whether the input string is capitalized and the rest of the input string is lower case" + isCapitalize(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsCapitalize_Entity_Mutations! + "Checks whether the input string is decapitalized and the rest of the input string is converted to lower case" + isDecapitalize(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsDecapitalize_Entity_Mutations! + "Checks whether the input string contains only digit characters" + isDigit(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsDigit_Entity_Mutations! + "Checks whether the input string is empty" + isEmpty(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsEmpty_Entity_Mutations! + "Checks whether the input string is kebab-cased" + isKebabCase(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsKebabCase_Entity_Mutations! + "Checks whether the input string has the first character in lower case" + isLowerFirst(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsLowerFirst_Entity_Mutations! + "Checks whether the input string has only lower case characters" + isLowercase(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsLowercase_Entity_Mutations! + "Checks whether the input string is numeric" + isNumeric(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsNumeric_Entity_Mutations! + "Checks whether the input string is PascalCased" + isPascalCase(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsPascalCase_Entity_Mutations! + "Checks whether the input string is SHOUTY-KEBAB-CASED" + isShoutyKebabCase(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsShoutyKebabCase_Entity_Mutations! + "Checks whether the input string is SHOUTY_SNAKE_CASED" + isShoutySnakeCase(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsShoutySnakeCase_Entity_Mutations! + "Checks whether the input string is snake_cased" + isSnakeCase(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsSnakeCase_Entity_Mutations! + "Checks whether the input string is a titlecased string and there is at least one character" + isTitleCase(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsTitleCase_Entity_Mutations! + "Checks whether the input string is Train-Cased" + isTrainCase(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsTrainCase_Entity_Mutations! + "Checks whether the input string has the first character in upper case" + isUpperFirst(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsUpperFirst_Entity_Mutations! + "Checks whether the input string has only upper case characters" + isUppercase(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean): String_IsUppercase_Entity_Mutations! + "Converts the input to kebab case" + kebabCase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_KebabCase_Entity_Mutations! + "Converts the first character of the input to lower case" + lowerFirst(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_LowerFirst_Entity_Mutations! + "Lowercase" + lowercase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_Lowercase_Entity_Mutations! + "Converts the input to pascal case" + pascalCase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_PascalCase_Entity_Mutations! + "Reverses the given string" + reverse(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_Reverse_Entity_Mutations! + "Converts the input to SHOUTY kebab case" + shoutyKebabCase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_ShoutyKebabCase_Entity_Mutations! + "Converts the title to SHOUTY snake case" + shoutySnakeCase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_ShoutySnakeCase_Entity_Mutations! + "Converts the subject to snake case" + snakeCase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_SnakeCase_Entity_Mutations! + "Starts With" + startsWith(id: ID, ids: [ID!], label: String, lhs: String, result: Boolean, rhs: String): String_StartsWith_Entity_Mutations! + "Returns the length of the input string" + stringLength(id: ID, ids: [ID!], label: String, lhs: String, result: Float): String_StringLength_Entity_Mutations! + "Strips all HTML tags" + stripHtmlTags(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_StripHtmlTags_Entity_Mutations! + "Converts the uppercase alpha characters of the input to lowercase and lowercase characters to uppercase" + swapCase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_SwapCase_Entity_Mutations! + "Renders a template" + templating(context: JSON, id: ID, ids: [ID!], label: String, result: String, template: String): String_Templating_Entity_Mutations! + "Converts the input to title case" + titleCase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_TitleCase_Entity_Mutations! + "Converts the input to train case" + trainCase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_TrainCase_Entity_Mutations! + "Trim" + trim(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_Trim_Entity_Mutations! + "Trim End" + trimEnd(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_TrimEnd_Entity_Mutations! + "Trim Start" + trimStart(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_TrimStart_Entity_Mutations! + "Unescapes HTML special characters" + unescapeHtml(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_UnescapeHtml_Entity_Mutations! + "Converts the first character of the title to upper case" + upperFirst(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_UpperFirst_Entity_Mutations! + "Uppercase" + uppercase(id: ID, ids: [ID!], label: String, lhs: String, result: String): String_Uppercase_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace String" +type StringNamespace { + "Converts the input to camel case" + camelCase(id: String, label: String, lhs: String, result: String): [String_CamelCase_Entity!]! + "Converts the first character of the input to upper case and convert the rest of the input to lower case" + capitalize(id: String, label: String, lhs: String, result: String): [String_Capitalize_Entity!]! + "Counts the characters" + charCount(id: String, label: String, lhs: String, result: Float): [String_CharCount_Entity!]! + "Counts the graphemes in the input string taking care of surrogate pairs and combining marks" + charCountGraphemes(id: String, label: String, lhs: String, result: Float): [String_CharCountGraphemes_Entity!]! + "Returns everything after the given search" + chopAfter(id: String, label: String, lhs: String, result: String, rhs: String): [String_ChopAfter_Entity!]! + "Returns everything after the last given search" + chopAfterLast(id: String, label: String, lhs: String, result: String, rhs: String): [String_ChopAfterLast_Entity!]! + "Returns everything before the given search" + chopBefore(id: String, label: String, lhs: String, result: String, rhs: String): [String_ChopBefore_Entity!]! + "Returns everything before the last given search" + chopBeforeLast(id: String, label: String, lhs: String, result: String, rhs: String): [String_ChopBeforeLast_Entity!]! + "Extracts the prefix from the input" + chopRemovePrefix(id: String, label: String, lhs: String, result: String, rhs: String): [String_ChopRemovePrefix_Entity!]! + "Extracts the suffix from the input" + chopRemoveSuffix(id: String, label: String, lhs: String, result: String, rhs: String): [String_ChopRemoveSuffix_Entity!]! + "Concat" + concat(id: String, label: String, lhs: String, result: String, rhs: String): [String_Concat_Entity!]! + "Contains" + contains(id: String, label: String, lhs: String, result: Boolean, rhs: String): [String_Contains_Entity!]! + "Counts the number of substring appearances in the input string" + countSubstrings(id: String, label: String, lhs: String, result: Float, rhs: String): [String_CountSubstrings_Entity!]! + "Counting occurrences of unique words in the input string. This function respects unicode" + countUniqueWords(id: String, label: String, lhs: String, result: Float, rhs: String): [String_CountUniqueWords_Entity!]! + "Counts the number of words in the input string" + countWords(id: String, label: String, lhs: String, result: Float, rhs: String): [String_CountWords_Entity!]! + "Converts the first character of the input to lower case and convert the rest of the input to lower case" + decapitalize(id: String, label: String, lhs: String, result: String): [String_Decapitalize_Entity!]! + "Ends With" + endsWith(id: String, label: String, lhs: String, result: Boolean, rhs: String): [String_EndsWith_Entity!]! + "Escapes HTML special characters" + escapeHtml(id: String, label: String, lhs: String, result: String): [String_EscapeHtml_Entity!]! + "Escapes the regular expression special characters" + escapeRegexp(id: String, label: String, lhs: String, result: String): [String_EscapeRegexp_Entity!]! + "Checks whether the input string contains only alpha characters" + isAlpha(id: String, label: String, lhs: String, result: Boolean): [String_IsAlpha_Entity!]! + "Checks whether the input string contains contains only alpha and digit characters" + isAlphaDigit(id: String, label: String, lhs: String, result: Boolean): [String_IsAlphaDigit_Entity!]! + "Checks whether the input string is empty or contains only whitespaces" + isBlank(id: String, label: String, lhs: String, result: Boolean): [String_IsBlank_Entity!]! + "Checks whether the input string is camelCased" + isCamelCase(id: String, label: String, lhs: String, result: Boolean): [String_IsCamelCase_Entity!]! + "Checks whether the input string is capitalized and the rest of the input string is lower case" + isCapitalize(id: String, label: String, lhs: String, result: Boolean): [String_IsCapitalize_Entity!]! + "Checks whether the input string is decapitalized and the rest of the input string is converted to lower case" + isDecapitalize(id: String, label: String, lhs: String, result: Boolean): [String_IsDecapitalize_Entity!]! + "Checks whether the input string contains only digit characters" + isDigit(id: String, label: String, lhs: String, result: Boolean): [String_IsDigit_Entity!]! + "Checks whether the input string is empty" + isEmpty(id: String, label: String, lhs: String, result: Boolean): [String_IsEmpty_Entity!]! + "Checks whether the input string is kebab-cased" + isKebabCase(id: String, label: String, lhs: String, result: Boolean): [String_IsKebabCase_Entity!]! + "Checks whether the input string has the first character in lower case" + isLowerFirst(id: String, label: String, lhs: String, result: Boolean): [String_IsLowerFirst_Entity!]! + "Checks whether the input string has only lower case characters" + isLowercase(id: String, label: String, lhs: String, result: Boolean): [String_IsLowercase_Entity!]! + "Checks whether the input string is numeric" + isNumeric(id: String, label: String, lhs: String, result: Boolean): [String_IsNumeric_Entity!]! + "Checks whether the input string is PascalCased" + isPascalCase(id: String, label: String, lhs: String, result: Boolean): [String_IsPascalCase_Entity!]! + "Checks whether the input string is SHOUTY-KEBAB-CASED" + isShoutyKebabCase(id: String, label: String, lhs: String, result: Boolean): [String_IsShoutyKebabCase_Entity!]! + "Checks whether the input string is SHOUTY_SNAKE_CASED" + isShoutySnakeCase(id: String, label: String, lhs: String, result: Boolean): [String_IsShoutySnakeCase_Entity!]! + "Checks whether the input string is snake_cased" + isSnakeCase(id: String, label: String, lhs: String, result: Boolean): [String_IsSnakeCase_Entity!]! + "Checks whether the input string is a titlecased string and there is at least one character" + isTitleCase(id: String, label: String, lhs: String, result: Boolean): [String_IsTitleCase_Entity!]! + "Checks whether the input string is Train-Cased" + isTrainCase(id: String, label: String, lhs: String, result: Boolean): [String_IsTrainCase_Entity!]! + "Checks whether the input string has the first character in upper case" + isUpperFirst(id: String, label: String, lhs: String, result: Boolean): [String_IsUpperFirst_Entity!]! + "Checks whether the input string has only upper case characters" + isUppercase(id: String, label: String, lhs: String, result: Boolean): [String_IsUppercase_Entity!]! + "Converts the input to kebab case" + kebabCase(id: String, label: String, lhs: String, result: String): [String_KebabCase_Entity!]! + "Converts the first character of the input to lower case" + lowerFirst(id: String, label: String, lhs: String, result: String): [String_LowerFirst_Entity!]! + "Lowercase" + lowercase(id: String, label: String, lhs: String, result: String): [String_Lowercase_Entity!]! + "Converts the input to pascal case" + pascalCase(id: String, label: String, lhs: String, result: String): [String_PascalCase_Entity!]! + "Reverses the given string" + reverse(id: String, label: String, lhs: String, result: String): [String_Reverse_Entity!]! + "Converts the input to SHOUTY kebab case" + shoutyKebabCase(id: String, label: String, lhs: String, result: String): [String_ShoutyKebabCase_Entity!]! + "Converts the title to SHOUTY snake case" + shoutySnakeCase(id: String, label: String, lhs: String, result: String): [String_ShoutySnakeCase_Entity!]! + "Converts the subject to snake case" + snakeCase(id: String, label: String, lhs: String, result: String): [String_SnakeCase_Entity!]! + "Starts With" + startsWith(id: String, label: String, lhs: String, result: Boolean, rhs: String): [String_StartsWith_Entity!]! + stringBoolOperationComponent: [String_StringBoolOperation_Component!]! + stringComparisonComponent: [String_StringComparison_Component!]! + stringGateComponent: [String_StringGate_Component!]! + "Returns the length of the input string" + stringLength(id: String, label: String, lhs: String, result: Float): [String_StringLength_Entity!]! + stringNumberOperationComponent: [String_StringNumberOperation_Component!]! + stringOperationComponent: [String_StringOperation_Component!]! + stringStringNumberGateComponent: [String_StringStringNumberGate_Component!]! + "Strips all HTML tags" + stripHtmlTags(id: String, label: String, lhs: String, result: String): [String_StripHtmlTags_Entity!]! + "Converts the uppercase alpha characters of the input to lowercase and lowercase characters to uppercase" + swapCase(id: String, label: String, lhs: String, result: String): [String_SwapCase_Entity!]! + "Renders a template" + templating(context: JSON, id: String, label: String, result: String, template: String): [String_Templating_Entity!]! + "Converts the input to title case" + titleCase(id: String, label: String, lhs: String, result: String): [String_TitleCase_Entity!]! + "Converts the input to train case" + trainCase(id: String, label: String, lhs: String, result: String): [String_TrainCase_Entity!]! + "Trim" + trim(id: String, label: String, lhs: String, result: String): [String_Trim_Entity!]! + "Trim End" + trimEnd(id: String, label: String, lhs: String, result: String): [String_TrimEnd_Entity!]! + "Trim Start" + trimStart(id: String, label: String, lhs: String, result: String): [String_TrimStart_Entity!]! + "Unescapes HTML special characters" + unescapeHtml(id: String, label: String, lhs: String, result: String): [String_UnescapeHtml_Entity!]! + "Converts the first character of the title to upper case" + upperFirst(id: String, label: String, lhs: String, result: String): [String_UpperFirst_Entity!]! + "Uppercase" + uppercase(id: String, label: String, lhs: String, result: String): [String_Uppercase_Entity!]! +} + +"Converts the input to camel case" +type String_CamelCase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_CamelCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_CamelCase_Entity!]! +} + +"Converts the first character of the input to upper case and convert the rest of the input to lower case" +type String_Capitalize_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_Capitalize_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_Capitalize_Entity!]! +} + +"Counts the graphemes in the input string taking care of surrogate pairs and combining marks" +type String_CharCountGraphemes_Entity implements Entity & String_StringNumberOperation_Component { + _c__string__string_number_operation: ID + id: ID! + lhs: String + result: Float +} + +type String_CharCountGraphemes_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_CharCountGraphemes_Entity!]! +} + +"Counts the characters" +type String_CharCount_Entity implements Entity & String_StringNumberOperation_Component { + _c__string__string_number_operation: ID + id: ID! + lhs: String + result: Float +} + +type String_CharCount_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_CharCount_Entity!]! +} + +"Returns everything after the last given search" +type String_ChopAfterLast_Entity implements Entity & String_StringGate_Component { + _c__string__string_gate: ID + id: ID! + lhs: String + result: String + rhs: String +} + +type String_ChopAfterLast_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_ChopAfterLast_Entity!]! +} + +"Returns everything after the given search" +type String_ChopAfter_Entity implements Entity & String_StringGate_Component { + _c__string__string_gate: ID + id: ID! + lhs: String + result: String + rhs: String +} + +type String_ChopAfter_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_ChopAfter_Entity!]! +} + +"Returns everything before the last given search" +type String_ChopBeforeLast_Entity implements Entity & String_StringGate_Component { + _c__string__string_gate: ID + id: ID! + lhs: String + result: String + rhs: String +} + +type String_ChopBeforeLast_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_ChopBeforeLast_Entity!]! +} + +"Returns everything before the given search" +type String_ChopBefore_Entity implements Entity & String_StringGate_Component { + _c__string__string_gate: ID + id: ID! + lhs: String + result: String + rhs: String +} + +type String_ChopBefore_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_ChopBefore_Entity!]! +} + +"Extracts the prefix from the input" +type String_ChopRemovePrefix_Entity implements Entity & String_StringGate_Component { + _c__string__string_gate: ID + id: ID! + lhs: String + result: String + rhs: String +} + +type String_ChopRemovePrefix_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_ChopRemovePrefix_Entity!]! +} + +"Extracts the suffix from the input" +type String_ChopRemoveSuffix_Entity implements Entity & String_StringGate_Component { + _c__string__string_gate: ID + id: ID! + lhs: String + result: String + rhs: String +} + +type String_ChopRemoveSuffix_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_ChopRemoveSuffix_Entity!]! +} + +"Concat" +type String_Concat_Entity implements Entity & String_StringGate_Component { + _c__string__string_gate: ID + id: ID! + lhs: String + result: String + rhs: String +} + +type String_Concat_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_Concat_Entity!]! +} + +"Contains" +type String_Contains_Entity implements Entity & String_StringComparison_Component { + _c__string__string_comparison: ID + id: ID! + lhs: String + result: Boolean + rhs: String +} + +type String_Contains_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_Contains_Entity!]! +} + +"Counts the number of substring appearances in the input string" +type String_CountSubstrings_Entity implements Entity & String_StringStringNumberGate_Component { + _c__string__string_string_number_gate: ID + id: ID! + lhs: String + result: Float + rhs: String +} + +type String_CountSubstrings_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_CountSubstrings_Entity!]! +} + +"Counting occurrences of unique words in the input string. This function respects unicode" +type String_CountUniqueWords_Entity implements Entity & String_StringStringNumberGate_Component { + _c__string__string_string_number_gate: ID + id: ID! + lhs: String + result: Float + rhs: String +} + +type String_CountUniqueWords_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_CountUniqueWords_Entity!]! +} + +"Counts the number of words in the input string" +type String_CountWords_Entity implements Entity & String_StringStringNumberGate_Component { + _c__string__string_string_number_gate: ID + id: ID! + lhs: String + result: Float + rhs: String +} + +type String_CountWords_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_CountWords_Entity!]! +} + +"Converts the first character of the input to lower case and convert the rest of the input to lower case" +type String_Decapitalize_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_Decapitalize_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_Decapitalize_Entity!]! +} + +"Ends With" +type String_EndsWith_Entity implements Entity & String_StringComparison_Component { + _c__string__string_comparison: ID + id: ID! + lhs: String + result: Boolean + rhs: String +} + +type String_EndsWith_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_EndsWith_Entity!]! +} + +"Escapes HTML special characters" +type String_EscapeHtml_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_EscapeHtml_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_EscapeHtml_Entity!]! +} + +"Escapes the regular expression special characters" +type String_EscapeRegexp_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_EscapeRegexp_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_EscapeRegexp_Entity!]! +} + +"Checks whether the input string contains contains only alpha and digit characters" +type String_IsAlphaDigit_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsAlphaDigit_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsAlphaDigit_Entity!]! +} + +"Checks whether the input string contains only alpha characters" +type String_IsAlpha_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsAlpha_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsAlpha_Entity!]! +} + +"Checks whether the input string is empty or contains only whitespaces" +type String_IsBlank_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsBlank_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsBlank_Entity!]! +} + +"Checks whether the input string is camelCased" +type String_IsCamelCase_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsCamelCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsCamelCase_Entity!]! +} + +"Checks whether the input string is capitalized and the rest of the input string is lower case" +type String_IsCapitalize_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsCapitalize_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsCapitalize_Entity!]! +} + +"Checks whether the input string is decapitalized and the rest of the input string is converted to lower case" +type String_IsDecapitalize_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsDecapitalize_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsDecapitalize_Entity!]! +} + +"Checks whether the input string contains only digit characters" +type String_IsDigit_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsDigit_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsDigit_Entity!]! +} + +"Checks whether the input string is empty" +type String_IsEmpty_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsEmpty_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsEmpty_Entity!]! +} + +"Checks whether the input string is kebab-cased" +type String_IsKebabCase_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsKebabCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsKebabCase_Entity!]! +} + +"Checks whether the input string has the first character in lower case" +type String_IsLowerFirst_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsLowerFirst_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsLowerFirst_Entity!]! +} + +"Checks whether the input string has only lower case characters" +type String_IsLowercase_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsLowercase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsLowercase_Entity!]! +} + +"Checks whether the input string is numeric" +type String_IsNumeric_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsNumeric_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsNumeric_Entity!]! +} + +"Checks whether the input string is PascalCased" +type String_IsPascalCase_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsPascalCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsPascalCase_Entity!]! +} + +"Checks whether the input string is SHOUTY-KEBAB-CASED" +type String_IsShoutyKebabCase_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsShoutyKebabCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsShoutyKebabCase_Entity!]! +} + +"Checks whether the input string is SHOUTY_SNAKE_CASED" +type String_IsShoutySnakeCase_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsShoutySnakeCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsShoutySnakeCase_Entity!]! +} + +"Checks whether the input string is snake_cased" +type String_IsSnakeCase_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsSnakeCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsSnakeCase_Entity!]! +} + +"Checks whether the input string is a titlecased string and there is at least one character" +type String_IsTitleCase_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsTitleCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsTitleCase_Entity!]! +} + +"Checks whether the input string is Train-Cased" +type String_IsTrainCase_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsTrainCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsTrainCase_Entity!]! +} + +"Checks whether the input string has the first character in upper case" +type String_IsUpperFirst_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsUpperFirst_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsUpperFirst_Entity!]! +} + +"Checks whether the input string has only upper case characters" +type String_IsUppercase_Entity implements Entity & String_StringBoolOperation_Component { + _c__string__string_bool_operation: ID + id: ID! + lhs: String + result: Boolean +} + +type String_IsUppercase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_IsUppercase_Entity!]! +} + +"Converts the input to kebab case" +type String_KebabCase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_KebabCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_KebabCase_Entity!]! +} + +"Converts the first character of the input to lower case" +type String_LowerFirst_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_LowerFirst_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_LowerFirst_Entity!]! +} + +"Lowercase" +type String_Lowercase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_Lowercase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_Lowercase_Entity!]! +} + +"Converts the input to pascal case" +type String_PascalCase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_PascalCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_PascalCase_Entity!]! +} + +"Reverses the given string" +type String_Reverse_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_Reverse_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_Reverse_Entity!]! +} + +"Converts the input to SHOUTY kebab case" +type String_ShoutyKebabCase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_ShoutyKebabCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_ShoutyKebabCase_Entity!]! +} + +"Converts the title to SHOUTY snake case" +type String_ShoutySnakeCase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_ShoutySnakeCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_ShoutySnakeCase_Entity!]! +} + +"Converts the subject to snake case" +type String_SnakeCase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_SnakeCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_SnakeCase_Entity!]! +} + +"Starts With" +type String_StartsWith_Entity implements Entity & String_StringComparison_Component { + _c__string__string_comparison: ID + id: ID! + lhs: String + result: Boolean + rhs: String +} + +type String_StartsWith_Entity_Mutations { + delete: [ID!]! + update(lhs: String, rhs: String): [String_StartsWith_Entity!]! +} + +"Returns the length of the input string" +type String_StringLength_Entity implements Entity & String_StringNumberOperation_Component { + _c__string__string_number_operation: ID + id: ID! + lhs: String + result: Float +} + +type String_StringLength_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_StringLength_Entity!]! +} + +"Strips all HTML tags" +type String_StripHtmlTags_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_StripHtmlTags_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_StripHtmlTags_Entity!]! +} + +"Converts the uppercase alpha characters of the input to lowercase and lowercase characters to uppercase" +type String_SwapCase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_SwapCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_SwapCase_Entity!]! +} + +"Renders a template" +type String_Templating_Entity implements Entity { + context: JSON + id: ID! + result: String + template: String +} + +type String_Templating_Entity_Mutations { + delete: [ID!]! + update(context: JSON, result: String, template: String): [String_Templating_Entity!]! +} + +"Converts the input to title case" +type String_TitleCase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_TitleCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_TitleCase_Entity!]! +} + +"Converts the input to train case" +type String_TrainCase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_TrainCase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_TrainCase_Entity!]! +} + +"Trim End" +type String_TrimEnd_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_TrimEnd_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_TrimEnd_Entity!]! +} + +"Trim Start" +type String_TrimStart_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_TrimStart_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_TrimStart_Entity!]! +} + +"Trim" +type String_Trim_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_Trim_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_Trim_Entity!]! +} + +"Unescapes HTML special characters" +type String_UnescapeHtml_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_UnescapeHtml_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_UnescapeHtml_Entity!]! +} + +"Converts the first character of the title to upper case" +type String_UpperFirst_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_UpperFirst_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_UpperFirst_Entity!]! +} + +"Uppercase" +type String_Uppercase_Entity implements Entity & String_StringOperation_Component { + _c__string__string_operation: ID + id: ID! + lhs: String + result: String +} + +type String_Uppercase_Entity_Mutations { + delete: [ID!]! + update(lhs: String): [String_Uppercase_Entity!]! +} + +"Mutations for entities and relations on the namespace System" +type SystemMutations { + createSystemEnv(id: ID, label: String!, name: String!, value: String): System_SystemEnv_Entity! + "System Environment Variable" + systemEnv(id: ID, ids: [ID!], label: String, name: String, value: String): System_SystemEnv_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace System" +type SystemNamespace { + "System Environment Variable" + systemEnv(id: String, label: String, name: String, value: String): [System_SystemEnv_Entity!]! +} + +"System Environment Variable" +type System_SystemEnv_Entity implements Base_Named_Component & Core_Labeled_Component & Entity & Value_ValueString_Component { + _c__base__named: ID + _c__core__labeled: ID + _c__value__value_string: ID + id: ID! + label: String + "The name of an entity or a relation" + name: String + value: String +} + +type System_SystemEnv_Entity_Mutations { + delete: [ID!]! + update(label: String, name: String): [System_SystemEnv_Entity!]! +} + +"Mutations for entities and relations on the namespace Taxonomy" +type TaxonomyMutations { + "The outbound entity is categorized as the inbound category" + categorizedAs(inboundId: ID, label: String, outboundId: ID): Taxonomy_CategorizedAs_Relation_Mutations! + "A category is a fundamental and distinct class to which entities or concepts belong" + category(description: String, id: ID, ids: [ID!], label: String, name: String): Taxonomy_Category_Entity_Mutations! + createCategorizedAs(inboundId: ID, instanceId: ID, outboundId: ID, weight: Float!): Taxonomy_CategorizedAs_Relation! + createCategory(description: String!, id: ID, name: String!): Taxonomy_Category_Entity! + createHasSubcategory(inboundId: ID, instanceId: ID, outboundId: ID, weight: Float!): Taxonomy_HasSubcategory_Relation! + createTag(id: ID, label: String!, name: String!): Taxonomy_Tag_Entity! + createTaggedWith(inboundId: ID, instanceId: ID, label: String!, outboundId: ID, weight: Float!): Taxonomy_TaggedWith_Relation! + "The outbound category has the inbound entity as sub category" + hasSubcategory(inboundId: ID, label: String, outboundId: ID): Taxonomy_HasSubcategory_Relation_Mutations! + "A tag is a piece of information that describes the data or content that it is assigned to. Tags are nonhierarchical keywords used for Internet bookmarks, digital images, videos, files and so on. A tag doesn't carry any information or semantics itself." + tag(id: ID, ids: [ID!], label: String, name: String): Taxonomy_Tag_Entity_Mutations! + "The outbound entity is tagged with the inbound tag" + taggedWith(inboundId: ID, label: String, outboundId: ID): Taxonomy_TaggedWith_Relation_Mutations! +} + +"Queries for components, entities and relations on the namespace Taxonomy" +type TaxonomyNamespace { + "The outbound entity is categorized as the inbound category" + categorizedAs(weight: Float): [Taxonomy_CategorizedAs_Relation!]! + "A category is a fundamental and distinct class to which entities or concepts belong" + category(description: String, id: String, label: String, name: String): [Taxonomy_Category_Entity!]! + "The outbound category has the inbound entity as sub category" + hasSubcategory(weight: Float): [Taxonomy_HasSubcategory_Relation!]! + "A tag is a piece of information that describes the data or content that it is assigned to. Tags are nonhierarchical keywords used for Internet bookmarks, digital images, videos, files and so on. A tag doesn't carry any information or semantics itself." + tag(id: String, label: String, name: String): [Taxonomy_Tag_Entity!]! + "The outbound entity is tagged with the inbound tag" + taggedWith(weight: Float): [Taxonomy_TaggedWith_Relation!]! + weightedComponent: [Taxonomy_Weighted_Component!]! +} + +"The outbound entity is categorized as the inbound category" +type Taxonomy_CategorizedAs_Relation implements Relation & Taxonomy_Weighted_Component { + _c__taxonomy__weighted: ID + "The entity which is categorized." + categorized_entity: AllEntities! + "The category." + category: Taxonomy_Category_Entity! + instance_id: ID! + key: ID! + weight: Float +} + +type Taxonomy_CategorizedAs_Relation_Mutations { + delete: [ID!]! + update(weight: Float): [Taxonomy_CategorizedAs_Relation!]! +} + +"A category is a fundamental and distinct class to which entities or concepts belong" +type Taxonomy_Category_Entity implements Base_Describable_Component & Base_Named_Component & Entity { + _c__base__describable: ID + _c__base__named: ID + "The relations between the category and the categorized entities." + categorized_as: [Taxonomy_CategorizedAs_Relation!]! + "The category categorizes these entities." + categorizes: [AllEntities!]! + "The description of an entity or a relation" + description: String + "The parent categories." + has_parent_categories: [Taxonomy_HasSubcategory_Relation!]! + "The sub categories." + has_sub_categories: [Taxonomy_HasSubcategory_Relation!]! + id: ID! + "The name of an entity or a relation" + name: String + "The parent categories." + parent_categories: [Taxonomy_Category_Entity!]! + "The sub categories." + sub_categories: [Taxonomy_Category_Entity!]! +} + +type Taxonomy_Category_Entity_Mutations { + delete: [ID!]! + update(description: String, name: String): [Taxonomy_Category_Entity!]! +} + +"The outbound category has the inbound entity as sub category" +type Taxonomy_HasSubcategory_Relation implements Relation & Taxonomy_Weighted_Component { + _c__taxonomy__weighted: ID + instance_id: ID! + key: ID! + "The parent category." + parent_category: Taxonomy_Category_Entity! + "The sub category." + sub_category: Taxonomy_Category_Entity! + weight: Float +} + +type Taxonomy_HasSubcategory_Relation_Mutations { + delete: [ID!]! + update(weight: Float): [Taxonomy_HasSubcategory_Relation!]! +} + +"A tag is a piece of information that describes the data or content that it is assigned to. Tags are nonhierarchical keywords used for Internet bookmarks, digital images, videos, files and so on. A tag doesn't carry any information or semantics itself." +type Taxonomy_Tag_Entity implements Base_Named_Component & Core_Labeled_Component & Entity { + _c__base__named: ID + _c__core__labeled: ID + id: ID! + label: String + "The name of an entity or a relation" + name: String + "Entities which are tagged by this tag." + tagged_entities: [AllEntities!]! + "The weighted relations between the tag and the tagged entities." + tags_entities: [Taxonomy_TaggedWith_Relation!]! +} + +type Taxonomy_Tag_Entity_Mutations { + delete: [ID!]! + update(label: String, name: String): [Taxonomy_Tag_Entity!]! +} + +"The outbound entity is tagged with the inbound tag" +type Taxonomy_TaggedWith_Relation implements Core_Labeled_Component & Relation & Taxonomy_Weighted_Component { + _c__core__labeled: ID + _c__taxonomy__weighted: ID + instance_id: ID! + key: ID! + label: String + "The tag." + tag: Taxonomy_Tag_Entity! + "The entity which is tagged." + tagged_entity: AllEntities! + weight: Float +} + +type Taxonomy_TaggedWith_Relation_Mutations { + delete: [ID!]! + update(label: String, weight: Float): [Taxonomy_TaggedWith_Relation!]! +} + +"Queries for components, entities and relations on the namespace Trigger" +type TriggerNamespace { + "An action can be triggered" + actionComponent: [Trigger_Action_Component!]! + "A generator sends a trigger" + generatorComponent: [Trigger_Generator_Component!]! +} + +"Mutations for entities and relations on the namespace Value" +type ValueMutations { + createValueArray(id: ID, name: String!, value: [JSON!]!): Value_ValueArray_Entity! + createValueBoolean(id: ID, name: String!, value: Boolean!): Value_ValueBoolean_Entity! + createValueNumber(id: ID, name: String!, value: Float!): Value_ValueNumber_Entity! + createValueObject(id: ID, name: String!, value: JSON!): Value_ValueObject_Entity! + createValueString(id: ID, name: String!, value: String!): Value_ValueString_Entity! + "Value of type array" + valueArray(id: ID, ids: [ID!], label: String, name: String, value: [JSON!]): Value_ValueArray_Entity_Mutations! + "Value of type boolean" + valueBoolean(id: ID, ids: [ID!], label: String, name: String, value: Boolean): Value_ValueBoolean_Entity_Mutations! + "Value of type number" + valueNumber(id: ID, ids: [ID!], label: String, name: String, value: Float): Value_ValueNumber_Entity_Mutations! + "Value of type object" + valueObject(id: ID, ids: [ID!], label: String, name: String, value: JSON): Value_ValueObject_Entity_Mutations! + "Value of type string" + valueString(id: ID, ids: [ID!], label: String, name: String, value: String): Value_ValueString_Entity_Mutations! +} + +"Queries for components, entities and relations on the namespace Value" +type ValueNamespace { + "Value of type array" + valueArray(id: String, label: String, name: String, value: [JSON!]): [Value_ValueArray_Entity!]! + "Value of type array" + valueArrayComponent: [Value_ValueArray_Component!]! + "Value of type boolean" + valueBoolean(id: String, label: String, name: String, value: Boolean): [Value_ValueBoolean_Entity!]! + "Value of type boolean" + valueBooleanComponent: [Value_ValueBoolean_Component!]! + valueDebuggerDebugComponent: [Value_ValueDebuggerDebug_Component!]! + valueDebuggerTraceComponent: [Value_ValueDebuggerTrace_Component!]! + "Value of type number" + valueNumber(id: String, label: String, name: String, value: Float): [Value_ValueNumber_Entity!]! + "Value of type number" + valueNumberComponent: [Value_ValueNumber_Component!]! + "Value of type object" + valueObject(id: String, label: String, name: String, value: JSON): [Value_ValueObject_Entity!]! + "Value of type object" + valueObjectComponent: [Value_ValueObject_Component!]! + "Value of type string" + valueString(id: String, label: String, name: String, value: String): [Value_ValueString_Entity!]! + "Value of type string" + valueStringComponent: [Value_ValueString_Component!]! +} + +"Value of type array" +type Value_ValueArray_Entity implements Base_Named_Component & Entity & Value_ValueArray_Component { + _c__base__named: ID + _c__value__value_array: ID + id: ID! + "The name of an entity or a relation" + name: String + value: JSON +} + +type Value_ValueArray_Entity_Mutations { + delete: [ID!]! + update(name: String, value: [JSON!]): [Value_ValueArray_Entity!]! +} + +"Value of type boolean" +type Value_ValueBoolean_Entity implements Base_Named_Component & Entity & Value_ValueBoolean_Component { + _c__base__named: ID + _c__value__value_boolean: ID + id: ID! + "The name of an entity or a relation" + name: String + value: Boolean +} + +type Value_ValueBoolean_Entity_Mutations { + delete: [ID!]! + update(name: String, value: Boolean): [Value_ValueBoolean_Entity!]! +} + +"Value of type number" +type Value_ValueNumber_Entity implements Base_Named_Component & Entity & Value_ValueNumber_Component { + _c__base__named: ID + _c__value__value_number: ID + id: ID! + "The name of an entity or a relation" + name: String + value: Float +} + +type Value_ValueNumber_Entity_Mutations { + delete: [ID!]! + update(name: String, value: Float): [Value_ValueNumber_Entity!]! +} + +"Value of type object" +type Value_ValueObject_Entity implements Base_Named_Component & Entity & Value_ValueObject_Component { + _c__base__named: ID + _c__value__value_object: ID + id: ID! + "The name of an entity or a relation" + name: String + value: JSON +} + +type Value_ValueObject_Entity_Mutations { + delete: [ID!]! + update(name: String, value: JSON): [Value_ValueObject_Entity!]! +} + +"Value of type string" +type Value_ValueString_Entity implements Base_Named_Component & Entity & Value_ValueString_Component { + _c__base__named: ID + _c__value__value_string: ID + id: ID! + "The name of an entity or a relation" + name: String + value: String +} + +type Value_ValueString_Entity_Mutations { + delete: [ID!]! + update(name: String, value: String): [Value_ValueString_Entity!]! +} + +scalar JSON diff --git a/graphql.config.yml b/graphql.config.yml new file mode 100644 index 0000000..2573c20 --- /dev/null +++ b/graphql.config.yml @@ -0,0 +1,23 @@ +projects: + default: + schema: ./graphql/schema.graphql + include: ./plugins/*/graphql/**/*.graphql + extensions: + endpoints: + ReactiveGraph@http: + url: http://localhost:31415/graphql + introspect: true + ReactiveGraph@https: + url: https://localhost:31415/graphql + introspect: true + dynamicGraph: + schema: ./dynamic_graph/schema.graphql + include: ./plugins/*/dynamic_graph/**/*.graphql + extensions: + endpoints: + DynamicGraph@http: + url: http://localhost:31415/dynamic_graph + introspect: true + DynamicGraph@https: + url: https://localhost:31415/dynamic_graph + introspect: true diff --git a/graphql/schema.graphql b/graphql/schema.graphql new file mode 100644 index 0000000..5620d47 --- /dev/null +++ b/graphql/schema.graphql @@ -0,0 +1,1234 @@ +# This file was generated based on ".graphqlconfig". Do not edit manually. + +schema { + query: Query + mutation: Mutation + subscription: Subscription +} + +directive @concat(value: String!) on FIELD + +directive @random_uuid on FIELD + +"A behaviour." +type Behaviour { + "The name of the behaviour type." + name: String! + "The namespace the behaviour type belongs to." + namespace: String! +} + +"Search for behaviours (component behaviours, entity behaviours or relation behaviours)" +type Behaviours { + countEntityBehaviours: Int! + countEntityComponentBehaviours: Int! + countRelationBehaviours: Int! + countRelationComponentBehaviours: Int! + entities: [EntityBehaviour!]! + entityComponents: [ComponentBehaviour!]! + relationComponents: [ComponentBehaviour!]! + relations: [RelationBehaviour!]! +} + +"Components are composable parts which can be used by types (entity type, relation type)." +type Component { + behaviours: [ComponentBehaviour!]! + "Textual description of the component." + description: String! + "Query which entity types are using this component" + entityTypes: [EntityType!]! + "The extensions which are defined by the component." + extensions(type: ExtensionTypeId): [Extension!]! + "Query which relation types are using this component as inbound type" + inboundOf: [RelationType!]! + "The name of the component." + name: String! + "The namespace the component belongs to." + namespace: String! + "Query which relation types are using this component as outbound type" + outboundOf: [RelationType!]! + "The properties which are applied on entity or relation instances." + properties(name: String): [PropertyType!]! + "Query which relation types are using this component" + relationTypes: [RelationType!]! +} + +"A component behaviour." +type ComponentBehaviour { + "The behaviour type." + behaviour: Behaviour! + "The component." + component: Component! + "The name of the behaviour type." + name: String! + "The namespace the behaviour type belongs to." + namespace: String! +} + +"An entity behaviour." +type EntityBehaviour { + "The behaviour type." + behaviour: Behaviour! + "The entity type." + entityType: EntityType! + "The instances with the behaviour." + instances: [EntityInstance!]! + "The name of the behaviour type." + name: String! + "The namespace the behaviour type belongs to." + namespace: String! +} + +""" + +Entity instances represents an typed objects which contains properties. + +The entity type defines the properties (name, data type and socket type). + +In contrast to the entity type the entity instance stores values in it's +properties. +""" +type EntityInstance { + """ + + List of entity behaviours which have been actually applied on the entity instance + including behaviours which have been applied after creation. + """ + behaviours: [EntityBehaviour!]! + """ + + List of component behaviours which have been actually applied on the entity instance + including behaviours which have been applied after creation. + """ + componentBehaviours: [ComponentBehaviour!]! + """ + + The components which have been actually applied on the entity instance including + components which have been added after creation. + """ + components: [Component!]! + "The description of the entity instance." + description: String! + "The unique identifier of the entity instance." + id: UUID! + "List of relation instances which ends at this entity instance." + inbound( + "The inbound relation type" + type: RelationTypeId + ): [RelationInstance!]! + "The label of the entity instance if available." + label: String + "List of relation instances which starts at this entity instance." + outbound( + "The outbound relation type" + type: RelationTypeId + ): [RelationInstance!]! + """ + + The properties of then entity instance. + + Each property is represented by it's name (String) and it's value. The value is + a representation of a JSON. Therefore the value can be boolean, number, string, + array or an object. For more information about the data types please look at + https://docs.serde.rs/serde_json/value/enum.Value.html + """ + properties( + "Filters by property name" + name: String, + "Filters by property names" + names: [String!] + ): [PropertyInstance!]! + "The entity type of the entity instance." + type: EntityType +} + +"Entity types defines the type of entity instance." +type EntityType { + behaviours: [EntityBehaviour!]! + "The components of the entity type." + components: [Component!]! + "Textual description of the entity type." + description: String! + "The extensions which are defined by the entity type." + extensions(type: ExtensionTypeId): [Extension!]! + "List of relation types which has this entity type as inbound." + inboundRelations: [RelationType!]! + "Returns true, if the entity type is valid. This means all components exists." + isValid: Boolean! + """ + + The name of the entity type. + + The name is the unique identifier for entity types. + """ + name: String! + "The namespace the entity type belongs to." + namespace: String! + "List of relation types which has this entity type as outbound." + outboundRelations: [RelationType!]! + """ + + The properties / property types which are defined by the entity type or + by one of the components. + """ + properties(name: String): [PropertyType!]! +} + +""" + +An extension provides named but schema-less additional information. +Entity types, relation types and property types can provide additional +meta data. For example an extension named "shape" provides information +about the look and feel in the flow editor. +""" +type Extension { + "The name of the extension." + description: String! + "The additional information as JSON representation (schema-less)." + extension: JSON! + "The name of the extension." + name: String! + "The name of the extension." + namespace: String! +} + +""" + +A flow is a container for entity instances and relation instances. + +A flow is strictly associated with a wrapper entity instance. The properties +of the wrapper entity instance are the properties of the flow. + +Additionally, flows can be nested - from the perspective of the outer flow +the inner flow acts like an entity instance. The wrapper entity instance of +the inner flow is the interface which can be accessed by the outer flow. + +Entity instances and relation instances can be shared with multiple flows. + +It's even possible to connect entity instances from different flows with relation +instances. +""" +type FlowInstance { + "The entity instances contained by this flow." + entities: [EntityInstance!]! + """ + + The id of the flow corresponds to the id of the wrapper entity instance + + This means the vector of entity instances must contain an instance with + the id of the flow. + """ + id: UUID! + "The label of the entity instance if available." + label: String + "The relation instances contained by this flow." + relations: [RelationInstance!]! + "The (entity-) type of the flow." + type: EntityType + "The entity instance which is the wrapper for this flow." + wrapper: EntityInstance +} + +"Flow types are templates for flow instances." +type FlowType { + countEntityInstances: Int! + countRelationInstances: Int! + "Textual description of the flow type." + description: String! + "The entity instances contained by the flow type" + entityInstances: [EntityInstance!]! + "The extensions which are defined by the flow type." + extensions(type: ExtensionTypeId): [Extension!]! + """ + + Returns true, if the relation type is valid. + + This means all components exists and the outbound and inbound entity types are valid. + """ + isValid: Boolean! + """ + + The name of the flow type. + + The name is the unique identifier for flow types of the same namespace. + """ + name: String! + "The namespace the flow type belongs to." + namespace: String! + """ + + The properties of the flow type. + This are the properties of the wrapper entity instance. + """ + properties( + "Filters by property name" + name: String, + "Filters by property names" + names: [String!] + ): [PropertyInstance!]! + "The relation instances contained by the flow type" + relationInstances: [RelationInstance!]! + "The entity type of the flow type." + type: EntityType + "The variables of the flow type." + variables(name: String): [PropertyType!]! +} + +"Search for instances" +type Instances { + countEntityInstances( + "Counts the entity instances which behaves as the behaviour only." + behaviour: BehaviourTypeId, + "Counts the entity instances which are composed by the given component only." + component: ComponentTypeId, + "Counts the entity instances of the given type only." + type: EntityTypeId + ): Int! + countFlowInstances: Int! + countRelationInstances( + "Counts the entity instances of the given type only." + type: RelationTypeId + ): Int! + """ + + Search for entity instances. + + If an id is given, the entity instance with the given id will be returned. + + If an entity type is given, only entity instances of the given type are returned. + """ + entities( + "Filters the entity instances by applied behaviours." + behaviours: [BehaviourTypeId!], + "Filters the entity instances by applied components." + components: [ComponentTypeId!], + "Returns only the entity instance with the given id." + id: UUID, + "Returns the entity instance with the given label." + label: String, + "Query by properties." + properties: [PropertyInstanceDefinition!], + "Filters the entity instances by type." + type: EntityTypeId + ): [EntityInstance!]! + "Search for flows and their contained instances." + flows( + "Filters by the id of the flow" + id: UUID, + "Filters by the label of the flow" + label: String, + "Filters by the flow type" + type: EntityTypeId + ): [FlowInstance!]! + """ + + Search for relations instances. + + Relation instances can be searched by relation type name, the entity type of the outbound + entity instance, the entity type of the inbound entity instance, the id of the outbound + entity instance or the id of the inbound entity instance. All of these filters can be + combined. + """ + relations( + "Filters the relation instances by applied behaviours." + behaviours: [BehaviourTypeId!], + "Filters the relation instances by applied components." + components: [ComponentTypeId!], + "Filters the relation instances by the component of the inbound entity instance." + inboundComponentTy: ComponentTypeId, + "Filters the relation instances by the entity type of the inbound entity instance." + inboundEntityTy: EntityTypeId, + "Filters the relation instances by the id of the inbound entity instance" + inboundId: UUID, + "Filters the relation instances by the component of the outbound entity instance." + outboundComponentTy: ComponentTypeId, + "Filters the relation instances by the entity type of the outbound entity instance." + outboundEntityTy: EntityTypeId, + "Filters the relation instances by the id of the outbound entity instance" + outboundId: UUID, + "Query by properties." + properties: [PropertyInstanceDefinition!], + "Filters the relation instances by relation type" + type: RelationTypeId + ): [RelationInstance!]! +} + +"Mutations for the type system, the instances and the flows." +type Mutation { + "Mutations for instances (entity instances, relation instances)." + instances: MutationInstances! + "Mutations for instances (entity instances, relation instances)." + system: MutationSystem! + "Mutations for types (components, entity types, relation types)." + types: MutationTypes! +} + +"Mutations for components" +type MutationComponents { + "Adds an extension to the component with the given name." + addExtension(extension: ExtensionDefinition!, type: ComponentTypeId!): Component! + "Adds a property to the component with the given name." + addProperty(property: PropertyTypeDefinition!, type: ComponentTypeId!): Component! + "Creates a new component with the given name and properties." + create(description: String, extensions: [ExtensionDefinition!], properties: [PropertyTypeDefinition!], type: ComponentTypeId!): Component! + "Deletes the component with the given name." + delete(type: ComponentTypeId!): Boolean! + "Removes the extension with the given extension_name from the component with the given name." + removeExtension(extension: ExtensionTypeId!, type: ComponentTypeId!): Component! + "Removes the property with the given property_name from the component with the given name." + removeProperty(propertyName: String!, type: ComponentTypeId!): Component! +} + +"Mutation of entity instances." +type MutationEntityInstances { + connect(id: UUID!, type: BehaviourTypeId!): EntityInstance! + """ + + Creates a new entity instance of the given type. + + The entity type must exist. + + Optionally, an UUID can be specified. If no UUID is specified one will be generated + randomly. + + The given properties consists of a list of pairs of property name and property value. + If properties are not provided, default values will be used depending on the data type + of the property. + """ + create( + "Creates the entity instance with the given components." + components: [ComponentTypeId!], + "The id of the entity instance. If none is given a random uuid will be generated." + id: UUID, + properties: [PropertyInstanceDefinition!], + "The entity type" + type: EntityTypeId! + ): EntityInstance! + "Deletes an entity instance." + delete( + "If true, all relations to and from the entity instance will be deleted as well" + deleteRelations: Boolean, + "The id of the entity instance" + id: UUID! + ): Boolean! + disconnect(id: UUID!, type: BehaviourTypeId!): EntityInstance! + reconnect(id: UUID!, type: BehaviourTypeId!): EntityInstance! + """ + + Manually tick the entity instance. This means for each property of the entity instance + the corresponding reactive stream will be activated with it's last value. + + This leads to a recalculation if the entity instance is controlled by an behaviour which + consumes the reactive streams. + + Furthermore this leads to a new value propagation if the output property is connected + to other properties. + """ + tick(id: UUID!): EntityInstance! + "Triggers the entity instance with the given id." + trigger( + "Triggers the entity instance with the given id." + id: UUID, + "Triggers the entity instance with the given label." + label: String + ): EntityInstance! + "Updates the properties of the entity instance with the given id." + update( + "Adds the given components." + addComponents: [ComponentTypeId!], + "Updates the entity instance with the given id." + id: UUID, + "Updates the entity instance with the given label." + label: String, + "Updates the given properties" + properties: [PropertyInstanceDefinition!], + "Removes the given components." + removeComponents: [ComponentTypeId!] + ): EntityInstance! +} + +"Mutations for entity types" +type MutationEntityTypes { + "Adds the component with the given component_name to the entity type with the given name." + addComponent(component: ComponentTypeId!, type: EntityTypeId!): EntityType! + "Adds an extension to the entity type with the given name." + addExtension(extension: ExtensionDefinition!, type: EntityTypeId!): EntityType! + "Adds a property to the entity type with the given name." + addProperty(property: PropertyTypeDefinition!, type: EntityTypeId!): EntityType! + "Creates a new entity type with the given name and components and properties." + create( + components: [ComponentTypeId!], + "The extension on the entity type." + extensions: [ExtensionDefinition!], + "The definitions of properties. These are added additionally to the properties provided by the given components." + properties: [PropertyTypeDefinition!], + type: EntityTypeId! + ): EntityType! + "Deletes the entity type with the given name." + delete(type: EntityTypeId!): Boolean! + "Remove the component with the given component_name from the entity type with the given name." + removeComponent(component: ComponentTypeId!, type: EntityTypeId!): EntityType! + "Removes the extension with the given extension_name from the entity type with the given name." + removeExtension(extension: ExtensionTypeId!, type: EntityTypeId!): EntityType! + "Removes the property with the given property_name from the entity type with the given name." + removeProperty(propertyName: String!, type: EntityTypeId!): EntityType! +} + +"Mutations for flows and their contained instances." +type MutationFlowInstances { + "Adds an existing entity instance by id to the given flow by id" + addEntity(entityId: UUID!, flowId: UUID!): FlowInstance! + "Adds an existing relation instance by edge_key to the given flow by id" + addRelation(edgeKey: EdgeKeyDefinition!, flowId: UUID!): FlowInstance! + """ + + Manually ticks all entity instances and relation instances of this flow. This means, for + each property of each entity instance and relation instance the corresponding reactive + stream will be activated with it's last value. + + This leads to a recalculation if the instance is controlled by an behaviour which + consumes the reactive streams. + + In case of entity instances, it furthermore leads to a new value propagation if the output + property is connected to other properties. + """ + commit(id: UUID!): FlowInstance! + """ + + Creates a new flow and a corresponding wrapper entity instance. + + The given entity type must exist. It provides the properties for the wrapper entity instance + and therefore defines which properties of the flow are the inputs and outputs. + + Optionally, an UUID can be specified. + + Optionally, the initial values of the properties can be specified. Specified properties + which are not provided by the given entity type are lacking of a definition (data type, + socket type). + """ + create(flowId: UUID, namespace: String!, properties: [PropertyInstanceDefinition!], type: String!): FlowInstance! + "Creates a new entity instance and adds the entity instance to the given flow by id." + createEntity(entityId: UUID, flowId: UUID!, namespace: String!, properties: [PropertyInstanceDefinition!], type: String!): FlowInstance! + """ + + Creates a new flow from the given type. + + The corresponding wrapper entity instance will be created with the type. + + The given entity type must exist. It provides the properties for the wrapper entity instance + and therefore defines which properties of the flow are the inputs and outputs. + + Optionally, an UUID can be specified. + + Optionally, the initial values of the properties can be specified. Specified properties + which are not provided by the given entity type are lacking of a definition (data type, + socket type). + """ + createFromType(namespace: String!, properties: [PropertyInstanceDefinition!], typeName: String!, variables: [PropertyInstanceDefinition!]): FlowInstance! + "Creates a new relation instance and adds the relation instance to the given flow by id." + createRelation(edgeKey: EdgeKeyDefinition!, flowId: UUID!, properties: [PropertyInstanceDefinition!]): FlowInstance! + """ + + Imports the given flow. Creates entity instances and relation instances which are contained + in the given flow. + """ + import(flow: FlowInstanceDefinition!): FlowInstance! + "Removes an entity instance from flow." + removeEntity(entityId: UUID!, flowId: UUID!): FlowInstance! + "Removes an existing relation instance by edge_key from the given flow by id" + removeRelation(edgeKey: EdgeKeyDefinition!, flowId: UUID!): FlowInstance! +} + +"Mutations on instances." +type MutationInstances { + "Mutations on entity instances." + entities: MutationEntityInstances! + "Mutations for flows and their contained instances." + flows: MutationFlowInstances! + "Mutations on relation instances." + relations: MutationRelationInstances! +} + +"Mutations for plugins." +type MutationPlugins { + "Redeploys a plugin which is already installed, resolved or active." + redeploy(name: String!): Plugin! + restart(name: String!): Plugin! + start(name: String!): Plugin! + stop(name: String!): Plugin! + "Uninstalls a plugin" + uninstall(name: String!): Boolean! +} + +"Mutation of relation instances." +type MutationRelationInstances { + connect(edgeKey: EdgeKeyDefinition!, type: BehaviourTypeId!): RelationInstance! + """ + + Creates a new relation instance with the given edge_key. + + The edge key is the primary key of a relation instance and consists of the id of the + outbound entity instance, the name of the relation type and the id of the inbound + entity instance. + + The relation type must exist and the given type name is matched by a prefix search. + For example a given type name "default_connector--property_name--property_name" will match + as relation type "default_connector". + + Furthermore the outbound and the inbound entity instance must exist. + + The given properties consists of a list of pairs of property name and property value. + If properties are not provided, default values will be used depending on the data type + of the property. + """ + create( + "Creates the relation instance with the given components." + components: [ComponentTypeId!], + "Specifies the outbound id, the inbound id, the relation type and the instance_id." + edgeKey: EdgeKeyDefinition!, + properties: [PropertyInstanceDefinition!] + ): RelationInstance! + """ + + Creates a connector from a property of the outbound entity instance to a property of the inbound entity instance. + + The type_name must match a relation type exactly. + """ + createConnector( + "Creates the relation instance with the given components." + components: [ComponentTypeId!], + "The id of the inbound entity instance" + inboundId: UUID!, + "The name of the property of the inbound entity instance" + inboundPropertyName: String!, + "The id of the outbound entity instance" + outboundId: UUID!, + "The name of the property of the outbound entity instance" + outboundPropertyName: String!, + "The initial property values" + properties: [PropertyInstanceDefinition!], + "The name of the connector relation type" + type: RelationTypeId! + ): RelationInstance! + "Deletes an relation instance." + delete(edgeKey: EdgeKeyDefinition!): Boolean! + disconnect(edgeKey: EdgeKeyDefinition!, type: BehaviourTypeId!): RelationInstance! + reconnect(edgeKey: EdgeKeyDefinition!, type: BehaviourTypeId!): RelationInstance! + """ + + Manually tick the relation instance. This means for each property of the entity instance + the corresponding reactive stream will be activated with it's last value. + + This leads to a recalculation if the relation instance is controlled by an behaviour which + consumes the reactive streams. + + In case of the default_connector it does NOT lead to a new value propagation, because the + reactive streams are not consumed by the default_connector behaviour. + """ + tick(edgeKey: EdgeKeyDefinition!): RelationInstance! + "Updates the properties of the given relation instance by edge key." + update( + "Adds the components with the given name" + addComponents: [ComponentTypeId!], + edgeKey: EdgeKeyDefinition!, + "Updates the given properties" + properties: [PropertyInstanceDefinition!], + "Removes the components with the given name" + removeComponents: [ComponentTypeId!] + ): RelationInstance! +} + +"Mutations for relation types" +type MutationRelationTypes { + "Adds the component with the given component_name to the relation type with the given name." + addComponent(component: ComponentTypeId!, type: RelationTypeId!): RelationType! + "Adds an extension to the relation type with the given name." + addExtension(extension: ExtensionDefinition!, type: RelationTypeId!): RelationType! + "Adds a property to the relation type with the given name." + addProperty(property: PropertyTypeDefinition!, type: RelationTypeId!): RelationType! + """ + + Creates a new relation type with the given name and components and properties. + + The outbound entity type and the inbound entity type must be specified. + """ + create( + "Adds the given components to the newly created relation type." + components: [ComponentTypeId!], + "The extension on the relation type." + extensions: [ExtensionDefinition!], + inboundType: EntityTypeId!, + outboundType: EntityTypeId!, + "The definitions of properties. These are added additionally to the properties provided by the given components." + properties: [PropertyTypeDefinition!], + "The relation type." + type: RelationTypeId! + ): RelationType! + "Deletes the relation type with the given name." + delete(type: RelationTypeId!): Boolean! + "Remove the component with the given component_name from the relation type with the given name." + removeComponent(component: ComponentTypeId!, type: RelationTypeId!): RelationType! + "Removes the extension with the given extension_name from the relation type with the given name." + removeExtension(extension: ExtensionTypeId!, type: RelationTypeId!): RelationType! + "Removes the property with the given property_name from the relation type with the given name." + removeProperty(propertyName: String!, type: RelationTypeId!): RelationType! +} + +type MutationSystem { + plugins: MutationPlugins! +} + +"Mutations for types (components, entity types, relation types)." +type MutationTypes { + "Mutations for components" + components: MutationComponents! + "Mutations for entity types" + entities: MutationEntityTypes! + "Mutations for relation types" + relations: MutationRelationTypes! +} + +type Plugin { + dependencies: [Plugin!]! + dependents: [Plugin!]! + description: String! + id: UUID! + name: String! + path: String! + pluginApiVersion: String! + rustcVersion: String! + shortName: String! + state: String! + stem: String! + unsatisfiedDependencies: [Plugin!]! + version: String! +} + +""" + +The named property stores a value/document as JSON representation. + +Each property is represented by it's name (String) and it's value. The value is +a representation of a JSON value/document. Therefore the value can be boolean, +number, string, array or an object. For more information about the data types +please look at https://docs.serde.rs/serde_json/value/enum.Value.html +""" +type PropertyInstance { + "The name of the property." + name: String! + "The type of the property." + type: PropertyType + "The value of the property as JSON representation." + value: JSON! +} + +""" + +Property types defines the type of a property instance. +The property type defines the name, the data type and +the socket type of a property. A property type does not +contain any value. +""" +type PropertyType { + "The data type of the property instances." + dataType: DataType! + "Textual description of the component." + description: String! + "The extensions which are defined by the entity type." + extensions(type: ExtensionTypeId): [Extension!]! + "The property instance is mutable or immutable." + mutability: Mutability! + "The name of the component." + name: String! + "The socket type of the property instances." + socketType: SocketType! +} + +"Search queries for the type system, the instances and the flows." +type Query { + """ + + Search for behaviours (entity behaviours, entity component behaviours, relation behaviours, + relation component behaviours). + """ + behaviours: Behaviours! + "Search for instances (entity instances, relation instances)." + instances: Instances! + randomUuid: String! + system: System! + "Search for types (components, entity types, relation types)." + types: Types! +} + +"A relation behaviour." +type RelationBehaviour { + "The behaviour type." + behaviour: Behaviour! + "The instances with the behaviour." + instances: [RelationInstance!]! + "The name of the behaviour type." + name: String! + "The namespace the behaviour type belongs to." + namespace: String! + "The relation type." + relationType: RelationType! +} + +""" + +Relation instances are edges from an outbound entity instance to an +inbound entity instance. + +The relation instance is of a relation type. The relation type defines +the entity types of the outbound entity instance and the inbound entity +instance. Furthermore the relation type defines which properties +(name, data type, socket type) a relation instance have to have. + +In contrast to the relation type, the relation instance stores values/ +documents in it's properties. +""" +type RelationInstance { + """ + + List of relation behaviours which have been actually applied on the relation instance + including behaviours which have been applied after creation. + """ + behaviours: [RelationBehaviour!]! + """ + + List of component behaviours which have been actually applied on the entity instance + including behaviours which have been applied after creation. + """ + componentBehaviours: [ComponentBehaviour!]! + """ + + The components which have been actually applied on the relation instance including + components which have been added after creation. + """ + components: [Component!]! + "Textual description of the relation instance." + description: String! + """ + + The inbound entity instance. + + You can use this in order to navigate from the inbound entity instance to the outbound + entity instance or vice versa. + """ + inbound: EntityInstance! + "The instance id of the relation instance type." + instanceId: String! + """ + + The outbound entity instance. + + You can use this in order to navigate from the outbound entity instance to the inbound + entity instance or vice versa. + """ + outbound: EntityInstance! + """ + + The properties of then relation instance. + + Each property is represented by it's name (String) and it's value. The value is + a representation of a JSON. Therefore the value can be boolean, number, string, + array or an object. For more information about the data types please look at + https://docs.serde.rs/serde_json/value/enum.Value.html + """ + properties( + "Filters by property name." + name: String, + "Filters by property names" + names: [String!] + ): [PropertyInstance!]! + "The relation type." + type: RelationType +} + +""" + +A relation type defines the type of an relation instance. + +The relation type defines the entity types of the outbound and inbound entity instances. +Also the relation type defines the properties of the relation instance. +""" +type RelationType { + behaviours: [RelationBehaviour!]! + "The relation type composes it's properties by these components." + components: [Component!]! + "Textual description of the relation type." + description: String! + "The extensions which are defined by the relation type." + extensions(type: ExtensionTypeId): [Extension!]! + "The inbound components." + inboundComponents: [Component!]! + "The inbound entity type(s)." + inboundTypes: [EntityType!]! + """ + + Returns true, if the relation type is valid. + + This means all components exists and the outbound and inbound entity types are valid. + """ + isValid: Boolean! + """ + + The name of the relation type. + + The name is the unique identifier for relation types. + + Returns "default_connector" for "default_connector__property_name__property_name" + (without type suffix). + """ + name: String! + "The namespace the relation type belongs to." + namespace: String! + "The outbound components." + outboundComponents: [Component!]! + "The outbound entity type(s)." + outboundTypes: [EntityType!]! + """ + + The properties / property types which are defined by the relation type or + by one of the components. + """ + properties(name: String): [PropertyType!]! +} + +"Subscriptions for the reactive property instances." +type Subscription { + entity( + "The uuid of the entity instance" + id: UUID, + "The label of the entity instance" + label: String, + "The name of the property" + propertyName: String! + ): PropertyInstance! + relation( + edgeKey: EdgeKeyDefinition!, + "The name of the property" + propertyName: String! + ): PropertyInstance! +} + +type System { + plugins(id: UUID, name: String, state: String, stem: String): [Plugin!]! +} + +"Search for types (components, entity types or relation types)" +type Types { + """ + + Search for components + + Optionally the list of components can be filtered by name. + """ + components( + "Searches by the name of the components. Allowed wildcards are: ? and *" + search: String, + "The component type" + type: ComponentTypeId + ): [Component!]! + countComponents: Int! + countEntityTypes: Int! + countFlowTypes: Int! + countRelationTypes: Int! + """ + + Search for entity types. + + Optionally the list of entity types can be filtered by name. + """ + entities( + "Searches by the name of the entity types. Allowed wildcards are: ? and *" + search: String, + "The entity type" + type: EntityTypeId + ): [EntityType!]! + """ + + Search for flow types. + + Optionally the list of flow types can be filtered by name. + """ + flows( + "Searches by the name of the flow types. Allowed wildcards are: ? and *" + search: String, + "The flow type" + type: FlowTypeId + ): [FlowType!]! + "Search for relation types." + relations( + "Filters by inbound component" + inboundComponent: ComponentTypeId, + "Filters by inbound entity type" + inboundEntityType: EntityTypeId, + "Filters by outbound component" + outboundComponent: ComponentTypeId, + "Filters by outbound entity type" + outboundEntityType: EntityTypeId, + "The relation type." + type: RelationTypeId + ): [RelationType!]! +} + +""" + +The data types of a value. + +Derived from serde_json::Value but without value payload. +""" +enum DataType { + "Represents any type (relations)." + ANY + "Represents a JSON array." + ARRAY + "Represents a JSON boolean." + BOOL + "Represents a JSON null value." + NULL + "Represents a JSON number, whether integer or floating point." + NUMBER + "Represents a JSON object." + OBJECT + "Represents a JSON string." + STRING +} + +"The mutability of a property." +enum Mutability { + "The property is immutable." + IMMUTABLE + "The property is mutable." + MUTABLE +} + +""" + +The socket type defines if the property acts as an input or output socket +or is an hidden property +""" +enum SocketType { + "The property acts as input socket and accepts incoming connections." + INPUT + "The property doesn't act as input or output socket." + NONE + "The property acts as output socket and accepts outgoing connections." + OUTPUT +} + +"A scalar that can represent any JSON value." +scalar JSON + +""" + +A UUID is a unique 128-bit number, stored as 16 octets. UUIDs are parsed as +Strings within GraphQL. UUIDs are used to assign unique identifiers to +entities without requiring a central allocating authority. + +# References + +* [Wikipedia: Universally Unique Identifier](http://en.wikipedia.org/wiki/Universally_unique_identifier) +* [RFC4122: A Universally Unique IDentifier (UUID) URN Namespace](http://tools.ietf.org/html/rfc4122) +""" +scalar UUID + +input BehaviourTypeId { + "The name of the behaviour type." + name: String! + "The namespace of the behaviour type." + namespace: String! +} + +input ComponentTypeId { + "The name of the component." + name: String! + "The namespace of the component." + namespace: String! +} + +""" + +The primary key of an edge consists of the outbound id, the +type name and the inbound id. +""" +input EdgeKeyDefinition { + "The id of the inbound entity instance." + inboundId: UUID! + "The instance id." + instanceId: String! = "" + "The namespace." + namespace: String! + "The id of the outbound entity instance." + outboundId: UUID! + "The name of the relation type." + typeName: String! +} + +""" + +Entity instances represents an typed object which contains properties. + +The entity type defines the properties (name, data type and socket type). + +In contrast to the entity type the entity instance stores values in it's +properties. +""" +input EntityInstanceDefinition { + "The description of the entity instance." + description: String! + "Entity instance specific extensions." + extensions: [ExtensionDefinition!]! + "The unique identifier of the entity instance." + id: UUID! + "The namespace the entity type belongs to." + namespace: String! + """ + + The properties of then entity instance. + + Each property is represented by it's name (String) and it's value. The value is + a representation of a JSON. Therefore the value can be boolean, number, string, + array or an object. For more information about the data types please look at + https://docs.serde.rs/serde_json/value/enum.Value.html + """ + properties: [PropertyInstanceDefinition!]! + "The name of the entity type." + typeName: String! +} + +input EntityTypeId { + "The name of the entity type." + name: String! + "The namespace of the entity type." + namespace: String! +} + +input ExtensionDefinition { + "The description of the extension." + description: String! + "The extension as JSON representation." + extension: JSON! + "The namespace of the extension." + type: ExtensionTypeId! +} + +input ExtensionTypeId { + "The name of the extension." + name: String! + "The namespace of the extension." + namespace: String! +} + +""" + +Represents a flow with entity instances and relation instances. + +The entity type of the flow and the entity types of each provided entity instance must exist. +The relation types of each provided relation instance must exist. +""" +input FlowInstanceDefinition { + "Textual description of the flow." + description: String! + """ + + The entity instances which are contained in this flow. + + It can't have a default because the wrapper entity instance must be + present in the list of entities. + """ + entityInstances: [EntityInstanceDefinition!]! + """ + + The id of the flow corresponds to the id of the wrapper entity instance + + This means the vector of entity instances must contain an instance with + the id of the flow. + """ + id: UUID! + "The name of the flow." + name: String! + "The namespace the entity type belongs to." + namespace: String! + "The relation instances which are contained in this flow." + relationInstances: [RelationInstanceDefinition!]! + "The name of the entity type." + typeName: String! +} + +input FlowTypeId { + "The name of the flow type." + name: String! + "The namespace of the flow type." + namespace: String! +} + +input PropertyInstanceDefinition { + "The name of the property." + name: String! + "The value of the property as JSON representation." + value: JSON! +} + +input PropertyTypeDefinition { + "The data type of the property" + dataType: DataType! + "The description of the property" + description: String! + "Property specific extensions" + extensions: [ExtensionDefinition!]! + "The property is mutable or immutable" + mutability: Mutability! + "The name of the property" + name: String! + "Specifies which type of socket" + socketType: SocketType! +} + +""" + +Relation instances are edges from an outbound entity instance to an +inbound entity instance. + +The relation instance is of a relation type. The relation type defines +the entity types of the outbound entity instance and the inbound entity +instance. Furthermore the relation type defines which properties +(name, data type, socket type) a relation instance have to have. + +In constrast to the relation type, the relation instance stores values/ +documents in it's properties. +""" +input RelationInstanceDefinition { + "Textual description of the relation instance." + description: String! + "Relation instance specific extensions." + extensions: [ExtensionDefinition!]! + "The id of the inbound vertex." + inboundId: UUID! + "The instance id of the relation instance type." + instanceId: String! + "The namespace the relation type belongs to." + namespace: String! + "The id of the outbound vertex." + outboundId: UUID! + """ + + The properties of then relation instance. + + Each property is represented by it's name (String) and it's value. The value is + a representation of a JSON. Therefore the value can be boolean, number, string, + array or an object. For more information about the data types please look at + https://docs.serde.rs/serde_json/value/enum.Value.html + """ + properties: [PropertyInstanceDefinition!]! + "The name of the relation type." + typeName: String! +} + +input RelationTypeId { + "The name of the relation type." + name: String! + "The namespace of the relation type." + namespace: String! +} diff --git a/plugins/binary/README.md b/plugins/binary/README.md new file mode 100644 index 0000000..b21772d --- /dev/null +++ b/plugins/binary/README.md @@ -0,0 +1,21 @@ +# Plugin Binary + +1. Loads binary data into a property. The mime type is automatically detected. Binary data is represented as BASE64 encoded data-url. Specification: https://fetch.spec.whatwg.org/#data-urls +2. Saves binary data, which is represented as a BASE64-encoded data-url, to a file. + +## Entity Types + +| Name | Property | Data Type | Socket Type | +|----------------|--------------------|-----------|-------------| +| LoadBinaryData | filename | string | input | +| | data_url | string | output | +| SaveBinaryData | filename | string | input | +| | data_url | string | input | + +## Platform Compatibility + +| Platform | Compatibility | +|----------|---------------| +| Linux | ✓ | +| MacOS | ✓ | +| Windows | ✓ | diff --git a/plugins/binary/crates/model/Cargo.toml b/plugins/binary/crates/model/Cargo.toml new file mode 100644 index 0000000..b6e8be3 --- /dev/null +++ b/plugins/binary/crates/model/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "reactive-graph-sys-binary-model" +description = "Reactive Graph - SYS - Binary - Model" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +readme = "../../../../README.md" + +[dependencies] +data-url = { workspace = true } +lazy_static = { workspace = true } +paste = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +strum_macros = { workspace = true } + +reactive-graph-behaviour-model-api = { workspace = true } +reactive-graph-graph = { workspace = true } +reactive-graph-reactive-model-api = { workspace = true } +reactive-graph-reactive-model-impl = { workspace = true } +reactive-graph-runtime-model = { workspace = true } + +reactive-graph-model-base = { version = "0.10.0", git = "https://github.com/reactive-graph/std.git" } +reactive-graph-sys-file-model = { version = "0.10.0", path = "../../../file/crates/model" } + +[lib] +crate-type = ["lib"] diff --git a/plugins/binary/crates/model/src/component/binary_data.rs b/plugins/binary/crates/model/src/component/binary_data.rs new file mode 100644 index 0000000..d4cde34 --- /dev/null +++ b/plugins/binary/crates/model/src/component/binary_data.rs @@ -0,0 +1,46 @@ +use data_url::DataUrl; + +use crate::NAMESPACE_BINARY; +use reactive_graph_behaviour_model_api::behaviour_ty; +use reactive_graph_graph::component_model; +use reactive_graph_graph::component_ty; +use reactive_graph_graph::properties; + +properties!(BinaryDataProperties, (DATA_URL, "data_url", "")); + +component_ty!(COMPONENT_BINARY_DATA, NAMESPACE_BINARY, COMPONENT_NAME_BINARY_DATA, "binary_data"); +behaviour_ty!(BEHAVIOUR_BINARY_DATA, NAMESPACE_BINARY, BEHAVIOUR_NAME_BINARY_DATA, "binary_data"); + +component_model!( + BinaryData, + data data_url string +); + +pub trait BinaryDataUrl: BinaryData { + fn mime_type(&self) -> Option { + if let Some(data_url) = self.get_data_url() { + if let Ok(data_url) = DataUrl::process(&data_url) { + return Some(data_url.mime_type().type_.clone()); + } + } + None + } + + fn subtype(&self) -> Option { + if let Some(data_url) = self.get_data_url() { + if let Ok(data_url) = DataUrl::process(&data_url) { + return Some(data_url.mime_type().subtype.clone()); + } + } + None + } + + fn charset(&self) -> Option { + if let Some(data_url) = self.get_data_url() { + if let Ok(data_url) = DataUrl::process(&data_url) { + return data_url.mime_type().get_parameter("charset").map(String::from); + } + } + None + } +} diff --git a/plugins/binary/crates/model/src/component/load_binary_data.rs b/plugins/binary/crates/model/src/component/load_binary_data.rs new file mode 100644 index 0000000..ae06d50 --- /dev/null +++ b/plugins/binary/crates/model/src/component/load_binary_data.rs @@ -0,0 +1,8 @@ +use crate::NAMESPACE_BINARY; +use reactive_graph_behaviour_model_api::behaviour_ty; +use reactive_graph_behaviour_model_api::component_behaviour_ty; +use reactive_graph_graph::component_ty; + +component_ty!(COMPONENT_LOAD_BINARY_DATA, NAMESPACE_BINARY, COMPONENT_NAME_LOAD_BINARY_DATA, "load_binary_data"); +behaviour_ty!(BEHAVIOUR_LOAD_BINARY_DATA, NAMESPACE_BINARY, BEHAVIOUR_NAME_LOAD_BINARY_DATA, "load_binary_data"); +component_behaviour_ty!(COMPONENT_BEHAVIOUR_LOAD_BINARY_DATA, COMPONENT_LOAD_BINARY_DATA, BEHAVIOUR_LOAD_BINARY_DATA); diff --git a/plugins/binary/crates/model/src/component/mod.rs b/plugins/binary/crates/model/src/component/mod.rs new file mode 100644 index 0000000..930a4b5 --- /dev/null +++ b/plugins/binary/crates/model/src/component/mod.rs @@ -0,0 +1,7 @@ +pub use binary_data::*; +pub use load_binary_data::*; +pub use save_binary_data::*; + +pub mod binary_data; +pub mod load_binary_data; +pub mod save_binary_data; diff --git a/plugins/binary/crates/model/src/component/save_binary_data.rs b/plugins/binary/crates/model/src/component/save_binary_data.rs new file mode 100644 index 0000000..558a859 --- /dev/null +++ b/plugins/binary/crates/model/src/component/save_binary_data.rs @@ -0,0 +1,8 @@ +use crate::NAMESPACE_BINARY; +use reactive_graph_behaviour_model_api::behaviour_ty; +use reactive_graph_behaviour_model_api::component_behaviour_ty; +use reactive_graph_graph::component_ty; + +component_ty!(COMPONENT_SAVE_BINARY_DATA, NAMESPACE_BINARY, COMPONENT_NAME_SAVE_BINARY_DATA, "save_binary_data"); +behaviour_ty!(BEHAVIOUR_SAVE_BINARY_DATA, NAMESPACE_BINARY, BEHAVIOUR_NAME_SAVE_BINARY_DATA, "save_binary_data"); +component_behaviour_ty!(COMPONENT_BEHAVIOUR_SAVE_BINARY_DATA, COMPONENT_SAVE_BINARY_DATA, BEHAVIOUR_SAVE_BINARY_DATA); diff --git a/plugins/binary/crates/model/src/entity/load_binary_data.rs b/plugins/binary/crates/model/src/entity/load_binary_data.rs new file mode 100644 index 0000000..fd7ed7e --- /dev/null +++ b/plugins/binary/crates/model/src/entity/load_binary_data.rs @@ -0,0 +1,19 @@ +use crate::BinaryData; +use crate::BinaryDataUrl; +use crate::NAMESPACE_BINARY; +use reactive_graph_graph::entity_ty; +use reactive_graph_model_base::Named; +use reactive_graph_sys_file_model::File; +use reactive_graph_reactive_model_api::entity_model; +use reactive_graph_runtime_model::Action; + +// All properties are defined in the component(s) + +entity_ty!(ENTITY_TYPE_LOAD_BINARY_DATA, NAMESPACE_BINARY, ENTITY_TYPE_NAME_LOAD_BINARY_DATA, "load_binary_data"); + +entity_model!(LoadBinaryData); +impl BinaryData for LoadBinaryData {} +impl BinaryDataUrl for LoadBinaryData {} +impl File for LoadBinaryData {} +impl Action for LoadBinaryData {} +impl Named for LoadBinaryData {} diff --git a/plugins/binary/crates/model/src/entity/mod.rs b/plugins/binary/crates/model/src/entity/mod.rs new file mode 100644 index 0000000..bad3bc6 --- /dev/null +++ b/plugins/binary/crates/model/src/entity/mod.rs @@ -0,0 +1,5 @@ +pub use load_binary_data::*; +pub use save_binary_data::*; + +pub mod load_binary_data; +pub mod save_binary_data; diff --git a/plugins/binary/crates/model/src/entity/save_binary_data.rs b/plugins/binary/crates/model/src/entity/save_binary_data.rs new file mode 100644 index 0000000..f4b359d --- /dev/null +++ b/plugins/binary/crates/model/src/entity/save_binary_data.rs @@ -0,0 +1,19 @@ +use crate::BinaryData; +use crate::BinaryDataUrl; +use crate::NAMESPACE_BINARY; +use reactive_graph_graph::entity_ty; +use reactive_graph_model_base::Named; +use reactive_graph_sys_file_model::File; +use reactive_graph_reactive_model_api::entity_model; +use reactive_graph_runtime_model::Action; + +// All properties are defined in the component(s) + +entity_ty!(ENTITY_TYPE_SAVE_BINARY_DATA, NAMESPACE_BINARY, ENTITY_TYPE_NAME_SAVE_BINARY_DATA, "save_binary_data"); + +entity_model!(SaveBinaryData); +impl BinaryData for SaveBinaryData {} +impl BinaryDataUrl for SaveBinaryData {} +impl File for SaveBinaryData {} +impl Action for SaveBinaryData {} +impl Named for SaveBinaryData {} diff --git a/plugins/binary/crates/model/src/lib.rs b/plugins/binary/crates/model/src/lib.rs new file mode 100644 index 0000000..f5d7a3f --- /dev/null +++ b/plugins/binary/crates/model/src/lib.rs @@ -0,0 +1,10 @@ +pub use component::binary_data::*; +pub use component::load_binary_data::*; +pub use component::save_binary_data::*; +pub use entity::load_binary_data::*; +pub use entity::save_binary_data::*; + +pub mod component; +pub mod entity; + +pub const NAMESPACE_BINARY: &str = "binary"; diff --git a/plugins/binary/crates/plugin/.run/Install Plugin Binary.run.xml b/plugins/binary/crates/plugin/.run/Install Plugin Binary.run.xml new file mode 100644 index 0000000..31c328d --- /dev/null +++ b/plugins/binary/crates/plugin/.run/Install Plugin Binary.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/plugins/binary/crates/plugin/Cargo.toml b/plugins/binary/crates/plugin/Cargo.toml new file mode 100644 index 0000000..482bb7f --- /dev/null +++ b/plugins/binary/crates/plugin/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "reactive-graph-sys-binary" +description = "Reactive Graph - SYS - Binary" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +readme = "../../../../README.md" + +[package.metadata.deb] +name = "libreactive-graph-sys-binary" +depends = "reactive-graph, libreactive-graph-plugin-base, libreactive-graph-plugin-file, libreactive-graph-plugin-trigger" +assets = [ + ["target/release/libreactive_graph_sys_binary.so", "usr/share/reactive-graph/default/plugins/installed/libreactive_graph_sys_binary.so", "755"], +] + +[dependencies] +async-trait = { workspace = true } +base64 = { workspace = true } +http = { workspace = true } +infer = { workspace = true } +log = { workspace = true, features = ["std", "serde"] } +log4rs = { workspace = true, features = ["console_appender", "file_appender", "toml_format"] } +matchit = { workspace = true } +mime_guess = { workspace = true } +rust-embed = { workspace = true, features = ["debug-embed", "compression"] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +shellexpand = { workspace = true } +springtime-di = { workspace = true, default-features = false, features = ["threadsafe", "derive"] } +strum = { workspace = true, features = ["derive"] } +strum_macros = { workspace = true } +uuid = { workspace = true, features = ["serde", "v4"] } + +reactive-graph-behaviour-model-api = { workspace = true } +reactive-graph-behaviour-model-impl = { workspace = true } +reactive-graph-graph = { workspace = true } +reactive-graph-plugin-api = { workspace = true } +reactive-graph-reactive-model-api = { workspace = true } +reactive-graph-reactive-model-impl = { workspace = true } +reactive-graph-runtime-model = { workspace = true } +reactive-graph-type-system-api = { workspace = true } + +reactive-graph-sys-binary-model = { version = "0.10.0", path = "../../crates/model" } +reactive-graph-sys-file-model = { version = "0.10.0", path = "../../../file/crates/model" } + +[dev-dependencies] +reactive-graph-graph = { workspace = true, features = ["test"] } + +[lib] +# Plugins use crate-type cdylib +# https://doc.rust-lang.org/reference/linkage.html +# https://users.rust-lang.org/t/what-is-the-difference-between-dylib-and-cdylib/28847/3 +crate-type = ["cdylib"] + +[package.metadata.cargo-post.dependencies] +toml = "0.8" +serde = { version = "1.0", features = ["derive"] } +glob = "0.3" diff --git a/plugins/binary/crates/plugin/build.rs b/plugins/binary/crates/plugin/build.rs new file mode 100644 index 0000000..8f7525a --- /dev/null +++ b/plugins/binary/crates/plugin/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rerun-if-changed=types"); +} diff --git a/plugins/binary/crates/plugin/post_build.rs b/plugins/binary/crates/plugin/post_build.rs new file mode 100644 index 0000000..12e00d0 --- /dev/null +++ b/plugins/binary/crates/plugin/post_build.rs @@ -0,0 +1,42 @@ +use serde::Deserialize; +use std::env; +use std::fs; +use std::path::PathBuf; + +#[derive(Deserialize)] +struct Deployment { + pub target_dirs: Vec, +} + +fn main() { + match fs::read_to_string("./.deployment.toml") { + Ok(toml_string) => { + let deployment: Result = toml::from_str(&toml_string); + match deployment { + Ok(deployment) => { + let mut crate_out_dir = env::var("CRATE_OUT_DIR").unwrap(); + crate_out_dir.push_str("/libreactive_graph_plugin_binary.*"); + for target_dir in deployment.target_dirs { + for entry in glob::glob(crate_out_dir.as_str()).unwrap() { + if let Ok(source_path) = entry { + let file_name = source_path.file_name().unwrap().to_str().unwrap(); + if file_name.ends_with(".so") || file_name.ends_with(".dll") { + let mut target_path = PathBuf::from(&target_dir); + target_path.push(file_name); + println!("Copy plugin from {} to {}", source_path.display(), target_path.display()); + let _ = fs::copy(source_path, target_path); + } + } + } + } + } + Err(e) => { + eprintln!("Failed to parse .deployment.toml: {}", e); + } + } + } + Err(e) => { + eprintln!("Could not read .deployment.toml: {}", e); + } + } +} diff --git a/plugins/binary/crates/plugin/src/behaviour/component/load_binary_data.rs b/plugins/binary/crates/plugin/src/behaviour/component/load_binary_data.rs new file mode 100644 index 0000000..2eed35d --- /dev/null +++ b/plugins/binary/crates/plugin/src/behaviour/component/load_binary_data.rs @@ -0,0 +1,78 @@ +use std::fs::File; +use std::io::Read; +use std::path::Path; + +use base64::Engine; +use base64::engine::general_purpose::STANDARD; +use mime_guess::from_path; +use reactive_graph_behaviour_model_api::behaviour_validator; +use reactive_graph_behaviour_model_api::prelude::*; +use reactive_graph_behaviour_model_impl::entity_behaviour; +use reactive_graph_graph::prelude::*; +use reactive_graph_reactive_model_impl::ReactiveEntity; +use reactive_graph_runtime_model::ActionProperties::TRIGGER; +use serde_json::Value; +use serde_json::json; +use uuid::Uuid; + +use reactive_graph_sys_binary_model::BinaryDataProperties::DATA_URL; +use reactive_graph_sys_file_model::FileProperties::FILENAME; + +entity_behaviour!( + LoadBinaryData, + LoadBinaryDataFactory, + LoadBinaryDataFsm, + LoadBinaryDataBehaviourTransitions, + LoadBinaryDataValidator +); + +behaviour_validator!(LoadBinaryDataValidator, Uuid, ReactiveEntity, TRIGGER.as_ref(), FILENAME.as_ref(), DATA_URL.as_ref()); + +impl BehaviourInit for LoadBinaryDataBehaviourTransitions { + fn init(&self) -> Result<(), BehaviourInitializationFailed> { + if self.reactive_instance.as_bool(TRIGGER).unwrap_or(false) { + if let Some(value) = self.reactive_instance.as_string(FILENAME).and_then(load_binary_data) { + self.reactive_instance.set(DATA_URL, value); + } + } + Ok(()) + } +} + +impl BehaviourConnect for LoadBinaryDataBehaviourTransitions { + fn connect(&self) -> Result<(), BehaviourConnectFailed> { + let reactive_instance = self.reactive_instance.clone(); + self.property_observers.observe_with_handle(TRIGGER.as_ref(), move |trigger: &Value| { + if !trigger.as_bool().unwrap_or(false) { + // Invalid type + return; + } + if let Some(value) = reactive_instance.as_string(FILENAME).and_then(load_binary_data) { + reactive_instance.set(DATA_URL, value); + } + }); + let reactive_instance = self.reactive_instance.clone(); + self.property_observers.observe_with_handle(FILENAME.as_ref(), move |filename: &Value| { + if let Some(value) = filename.as_str().map(String::from).and_then(load_binary_data) { + reactive_instance.set(DATA_URL, value); + } + }); + Ok(()) + } +} + +impl BehaviourShutdown for LoadBinaryDataBehaviourTransitions {} +impl BehaviourTransitions for LoadBinaryDataBehaviourTransitions {} + +fn load_binary_data(filename: String) -> Option { + let filename = shellexpand::tilde(&filename); + let path = Path::new(filename.as_ref()); + File::open(path).ok().and_then(|mut file| { + let mut buffer = Vec::new(); + let _ = file.read_to_end(&mut buffer); + infer::get(&buffer) + .map(|kind| kind.mime_type().to_string()) + .or_else(|| from_path(path).first().map(|x| x.to_string())) + .map(|mime_type| json!(format!("data:{};base64,{}", mime_type, STANDARD.encode(&buffer)))) + }) +} diff --git a/plugins/binary/crates/plugin/src/behaviour/component/mod.rs b/plugins/binary/crates/plugin/src/behaviour/component/mod.rs new file mode 100644 index 0000000..2a95435 --- /dev/null +++ b/plugins/binary/crates/plugin/src/behaviour/component/mod.rs @@ -0,0 +1,2 @@ +pub mod load_binary_data; +pub mod save_binary_data; diff --git a/plugins/binary/crates/plugin/src/behaviour/component/save_binary_data.rs b/plugins/binary/crates/plugin/src/behaviour/component/save_binary_data.rs new file mode 100644 index 0000000..d02ec37 --- /dev/null +++ b/plugins/binary/crates/plugin/src/behaviour/component/save_binary_data.rs @@ -0,0 +1,70 @@ +use std::fs::OpenOptions; +use std::io::Write; +use std::path::Path; + +use base64::Engine; +use base64::engine::general_purpose::STANDARD; +use reactive_graph_behaviour_model_api::behaviour_validator; +use reactive_graph_behaviour_model_api::prelude::*; +use reactive_graph_behaviour_model_impl::entity_behaviour; +use reactive_graph_graph::prelude::*; +use reactive_graph_reactive_model_impl::ReactiveEntity; +use reactive_graph_runtime_model::ActionProperties::TRIGGER; +use serde_json::Value; +use uuid::Uuid; + +use reactive_graph_sys_binary_model::BinaryDataProperties::DATA_URL; +use reactive_graph_sys_file_model::FileProperties::FILENAME; + +entity_behaviour!( + SaveBinaryData, + SaveBinaryDataFactory, + SaveBinaryDataFsm, + SaveBinaryDataBehaviourTransitions, + SaveBinaryDataValidator +); + +behaviour_validator!(SaveBinaryDataValidator, Uuid, ReactiveEntity, TRIGGER.as_ref(), FILENAME.as_ref(), DATA_URL.as_ref()); + +impl BehaviourInit for SaveBinaryDataBehaviourTransitions {} + +impl BehaviourConnect for SaveBinaryDataBehaviourTransitions { + fn connect(&self) -> Result<(), BehaviourConnectFailed> { + let reactive_instance = self.reactive_instance.clone(); + self.property_observers.observe_with_handle(TRIGGER.as_ref(), move |trigger: &Value| { + if !trigger.as_bool().unwrap_or(false) { + return; + } + if let Some(filename) = reactive_instance.as_string(FILENAME) { + let filename = shellexpand::tilde(&filename); + let path = Path::new(filename.as_ref()); + + if let Some(data_url) = reactive_instance.get(DATA_URL).and_then(|v| v.as_str().map(String::from)) { + // The next operations may be performance intensive + // Decode DataURL with BASE64 encoding to byte array + let mut parts = data_url.splitn(2, ','); + let _part_data_url_prefix = parts.next(); + let bytes = match parts.next() { + Some(part_base64_encoded_data) => match STANDARD.decode(part_base64_encoded_data) { + Ok(bytes) => Some(bytes), + Err(_) => None, + }, + None => None, + }; + if bytes.is_none() { + return; + } + + // Write byte array to file + if let Ok(mut file) = OpenOptions::new().write(true).create(true).truncate(true).open(path) { + let _success = file.write_all(bytes.unwrap().as_slice()); + } + } + } + }); + Ok(()) + } +} + +impl BehaviourShutdown for SaveBinaryDataBehaviourTransitions {} +impl BehaviourTransitions for SaveBinaryDataBehaviourTransitions {} diff --git a/plugins/binary/crates/plugin/src/behaviour/mod.rs b/plugins/binary/crates/plugin/src/behaviour/mod.rs new file mode 100644 index 0000000..9cea807 --- /dev/null +++ b/plugins/binary/crates/plugin/src/behaviour/mod.rs @@ -0,0 +1 @@ +pub mod component; diff --git a/plugins/binary/crates/plugin/src/lib.rs b/plugins/binary/crates/plugin/src/lib.rs new file mode 100644 index 0000000..5f30703 --- /dev/null +++ b/plugins/binary/crates/plugin/src/lib.rs @@ -0,0 +1,4 @@ +pub mod behaviour; +pub mod plugin; +pub mod providers; +pub mod web_resource_provider; diff --git a/plugins/binary/crates/plugin/src/plugin.rs b/plugins/binary/crates/plugin/src/plugin.rs new file mode 100644 index 0000000..30f9310 --- /dev/null +++ b/plugins/binary/crates/plugin/src/plugin.rs @@ -0,0 +1,76 @@ +use reactive_graph_plugin_api::EntityComponentBehaviourRegistry; +use reactive_graph_plugin_api::WebResourceManager; +use reactive_graph_plugin_api::prelude::plugin::*; +use reactive_graph_plugin_api::prelude::providers::*; + +use crate::behaviour::component::load_binary_data::LoadBinaryDataFactory; +use crate::behaviour::component::save_binary_data::SaveBinaryDataFactory; +use reactive_graph_sys_binary_model::BEHAVIOUR_LOAD_BINARY_DATA; +use reactive_graph_sys_binary_model::BEHAVIOUR_SAVE_BINARY_DATA; +use reactive_graph_sys_binary_model::COMPONENT_BEHAVIOUR_LOAD_BINARY_DATA; +use reactive_graph_sys_binary_model::COMPONENT_BEHAVIOUR_SAVE_BINARY_DATA; + +export_plugin!({ + "dependencies": [ + { "name": "reactive-graph-plugin-base", "version": ">=0.10.0, <0.11.0" }, + { "name": "reactive-graph-plugin-file", "version": ">=0.10.0, <0.11.0" }, + { "name": "reactive-graph-plugin-trigger", "version": ">=0.10.0, <0.11.0" } + ] +}); + +#[injectable] +pub trait BinaryPlugin: Plugin + Send + Sync {} + +#[derive(Component)] +pub struct BinaryPluginImpl { + component_provider: Arc + Send + Sync>, + + #[component(default = "component_provider_registry")] + component_provider_registry: Arc, + + entity_types_provider: Arc + Send + Sync>, + + #[component(default = "entity_types_provider_registry")] + entity_type_provider_registry: Arc, + + #[component(default = "entity_component_behaviour_registry")] + entity_component_behaviour_registry: Arc, + + web_resource_provider: Arc, + + #[component(default = "web_resource_manager")] + web_resource_manager: Arc, +} + +#[async_trait] +#[component_alias] +impl Plugin for BinaryPluginImpl { + async fn activate(&self) -> Result<(), PluginActivationError> { + self.component_provider_registry.register_provider(self.component_provider.clone()).await; + self.entity_type_provider_registry.register_provider(self.entity_types_provider.clone()).await; + + // Load Binary Data + let factory = Arc::new(LoadBinaryDataFactory::new(BEHAVIOUR_LOAD_BINARY_DATA.clone())); + self.entity_component_behaviour_registry + .register(COMPONENT_BEHAVIOUR_LOAD_BINARY_DATA.clone(), factory) + .await; + + // Save Binary Data + let factory = Arc::new(SaveBinaryDataFactory::new(BEHAVIOUR_SAVE_BINARY_DATA.clone())); + self.entity_component_behaviour_registry + .register(COMPONENT_BEHAVIOUR_SAVE_BINARY_DATA.clone(), factory) + .await; + self.web_resource_manager.register_provider(self.web_resource_provider.clone()).await; + + Ok(()) + } + + async fn deactivate(&self) -> Result<(), PluginDeactivationError> { + self.web_resource_manager.unregister_provider(self.web_resource_provider.id()).await; + self.entity_component_behaviour_registry.unregister(&COMPONENT_BEHAVIOUR_SAVE_BINARY_DATA).await; + self.entity_component_behaviour_registry.unregister(&COMPONENT_BEHAVIOUR_LOAD_BINARY_DATA).await; + self.entity_type_provider_registry.unregister_provider(self.entity_types_provider.id()).await; + self.component_provider_registry.unregister_provider(self.component_provider.id()).await; + Ok(()) + } +} diff --git a/plugins/binary/crates/plugin/src/providers/mod.rs b/plugins/binary/crates/plugin/src/providers/mod.rs new file mode 100644 index 0000000..66898c1 --- /dev/null +++ b/plugins/binary/crates/plugin/src/providers/mod.rs @@ -0,0 +1,9 @@ +use reactive_graph_plugin_api::prelude::providers::*; + +#[derive(TypeProvider, Component)] +#[type_provider(tys = "Components", path = "types/components")] +pub struct BinaryComponentsProvider {} + +#[derive(TypeProvider, Component)] +#[type_provider(tys = "EntityTypes", path = "types/entities")] +pub struct BinaryEntityTypesProvider {} diff --git a/plugins/binary/crates/plugin/src/tests/load_binary_data_test.rs b/plugins/binary/crates/plugin/src/tests/load_binary_data_test.rs new file mode 100644 index 0000000..fdbaa84 --- /dev/null +++ b/plugins/binary/crates/plugin/src/tests/load_binary_data_test.rs @@ -0,0 +1,63 @@ +use std::path::PathBuf; + +use serde_json::json; + +use crate::behaviour::component::load_binary_data::LoadBinaryDataFactory; +use crate::builder::ReactiveEntityInstanceBuilder; +use crate::model_binary::BinaryData; +use crate::model_binary::BinaryDataProperties::DATA_URL; +use crate::model_binary::BinaryDataUrl; +use crate::model_binary::LoadBinaryData; +use crate::model_binary::BEHAVIOUR_LOAD_BINARY_DATA; +use crate::model_binary::ENTITY_TYPE_LOAD_BINARY_DATA; +use crate::reactive::BehaviourFactory; +use crate::reactive::BehaviourState; +use reactive_graph_sys_file_model::File; +use reactive_graph_sys_file_model::FileProperties::FILENAME; +use reactive_graph_runtime_model::Action; +use reactive_graph_runtime_model::ActionProperties::TRIGGER; + +#[test] +fn rx_load_binary_data_test() { + let mut load_png_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + load_png_file_path.push("../../../../docs/images/inexor_2.png"); + load_png_file_path = load_png_file_path.canonicalize().unwrap(); + + let mut type_definition_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + type_definition_path.push("types/components/load_binary_data.json"); + type_definition_path = type_definition_path.canonicalize().unwrap(); + + let reactive_instance = ReactiveEntityInstanceBuilder::new(ENTITY_TYPE_LOAD_BINARY_DATA.clone()) + .property(DATA_URL, json!("")) + .property(TRIGGER, json!(false)) + .property(FILENAME, json!(load_png_file_path.to_str().unwrap())) + .build(); + + let load_binary_data = LoadBinaryData::from(reactive_instance.clone()); + + load_binary_data.trigger(); + let data_url = load_binary_data.get_data_url().unwrap(); + assert_eq!(0, data_url.len()); + + { + let factory = LoadBinaryDataFactory::new(BEHAVIOUR_LOAD_BINARY_DATA.clone()); + let behaviour = factory.create(reactive_instance.clone()).expect("Failed to create behaviour"); + assert_eq!(BehaviourState::Connected, behaviour.get_state()); + + println!("{}", load_png_file_path.display()); + load_binary_data.trigger(); + let data_url = load_binary_data.get_data_url().unwrap(); + println!("{}...[size: {} bytes, {} chars]", data_url.split_at(50).0, data_url.len(), data_url.chars().count()); + assert!(data_url.len() > 0); + assert_eq!("image", load_binary_data.mime_type().unwrap()); + assert_eq!("png", load_binary_data.subtype().unwrap()); + + println!("{}", type_definition_path.display()); + load_binary_data.set_filename(type_definition_path.to_str().unwrap()); + let data_url = load_binary_data.get_data_url().unwrap(); + println!("{}...[size: {} bytes, {} chars]", data_url.split_at(50).0, data_url.len(), data_url.chars().count()); + assert!(data_url.len() > 0); + assert_eq!("application", load_binary_data.mime_type().unwrap()); + assert_eq!("json", load_binary_data.subtype().unwrap()); + } +} diff --git a/plugins/binary/crates/plugin/src/tests/mod.rs b/plugins/binary/crates/plugin/src/tests/mod.rs new file mode 100644 index 0000000..309f8ae --- /dev/null +++ b/plugins/binary/crates/plugin/src/tests/mod.rs @@ -0,0 +1 @@ +mod load_binary_data_test; diff --git a/plugins/binary/crates/plugin/src/web_resource_provider.rs b/plugins/binary/crates/plugin/src/web_resource_provider.rs new file mode 100644 index 0000000..a4fb230 --- /dev/null +++ b/plugins/binary/crates/plugin/src/web_resource_provider.rs @@ -0,0 +1,214 @@ +use std::str::FromStr; +use std::sync::LazyLock; + +use async_trait::async_trait; +use base64::Engine; +use base64::engine::general_purpose::STANDARD; +use http::Response; +use http::StatusCode; +use http::request::Request; +use log::debug; +use matchit::Router; +use reactive_graph_graph::PropertyInstanceSetter; +use reactive_graph_graph::prelude::*; +use reactive_graph_plugin_api::EntityInstanceManager; +use reactive_graph_plugin_api::HttpBody; +use reactive_graph_plugin_api::WebResourceProvider; +use reactive_graph_plugin_api::prelude::plugin::*; +use serde_json::json; +use strum_macros::AsRefStr; +use strum_macros::Display; +use strum_macros::IntoStaticStr; +use uuid::Uuid; + +const CONTEXT_PATH: &str = "binary"; + +static ID: LazyLock = LazyLock::new(Uuid::new_v4); + +#[derive(AsRefStr, IntoStaticStr, Display)] +enum BinaryRequestType { + Uuid, + Label, +} + +#[derive(AsRefStr, IntoStaticStr, Display, Clone, Debug)] +enum EntityInstanceReference { + Id(Uuid), + Label(String), +} + +#[derive(Clone, Debug)] +struct PropertyReference { + pub entity_instance: EntityInstanceReference, + pub property_name: String, +} + +#[derive(Component)] +pub struct BinaryWebResourceProvider { + #[component(default = "crate::plugin::entity_instance_manager")] + entity_instance_manager: Arc, +} + +impl BinaryWebResourceProvider { + fn get_property_reference(&self, search: String) -> Option { + let mut matcher = Router::new(); + let _ = matcher.insert("/entities/:uuid/:property_name", BinaryRequestType::Uuid); + let _ = matcher.insert("/entities/label/*label", BinaryRequestType::Label); + match matcher.at(search.as_str()) { + Ok(matched) => match matched.value { + BinaryRequestType::Uuid => match matched.params.get("uuid") { + Some(uuid) => match Uuid::from_str(uuid) { + Ok(uuid) => matched.params.get("property_name").map(|property_name| PropertyReference { + entity_instance: EntityInstanceReference::Id(uuid), + property_name: String::from(property_name), + }), + Err(_) => None, + }, + None => None, + }, + BinaryRequestType::Label => matched.params.get("label").map(|label| PropertyReference { + entity_instance: EntityInstanceReference::Label(String::from(label)), + property_name: String::new(), + }), + }, + Err(_) => None, + } + } + + fn get_data_url(&self, property_reference: PropertyReference) -> Option { + match property_reference.entity_instance { + EntityInstanceReference::Id(id) => self + .entity_instance_manager + .get(id) + .and_then(|entity_instance| entity_instance.as_string(property_reference.property_name)) + .and_then(filter_by_base64_data_url), + EntityInstanceReference::Label(label) => { + self.entity_instance_manager + .get_by_label_with_params(label.as_str()) + .and_then(|(entity_instance, params)| { + debug!("params {:?}", params); + // Prefer path variable "property" + if let Some(data_url) = params.get("property").and_then(|property_name| entity_instance.as_string(property_name)) { + return Some(data_url); + } + // Try other path variable + params.iter().next().and_then(|(_, property_name)| entity_instance.as_string(property_name)) + }) + } + } + } + + fn set_data_url_binary(&self, property_reference: PropertyReference, bytes: &Vec) { + if let EntityInstanceReference::Id(id) = property_reference.entity_instance { + if let Some(entity_instance) = self.entity_instance_manager.get(id) { + if let Some(mime_type) = infer::get(bytes) { + let data_as_base64 = STANDARD.encode(bytes); + let data_url = json!(format!("data:{};base64,{}", mime_type, data_as_base64)); + entity_instance.set(property_reference.property_name, data_url); + } + } + } + } + + fn set_data_url_base64(&self, property_reference: PropertyReference, data_url_base64: &String) { + match property_reference.entity_instance { + EntityInstanceReference::Id(id) => { + if let Some(entity_instance) = self.entity_instance_manager.get(id) { + debug!("{} {}", id, property_reference.property_name); + entity_instance.set(property_reference.property_name, json!(data_url_base64)); + } + } + EntityInstanceReference::Label(_) => {} + } + } + + fn extract_data_url_payload(&self, data_url: String) -> Option { + let mut parts = data_url.splitn(2, ','); + parts.next(); + match parts.next() { + Some(part_base64_encoded_data) => match STANDARD.decode(part_base64_encoded_data) { + Ok(bytes) => Some(HttpBody::Binary(bytes)), + Err(_) => None, + }, + None => None, + } + } + + fn decode_data_url(&self, data_url: String) -> http::Result> { + match self.extract_data_url_payload(data_url) { + Some(body) => Response::builder().status(StatusCode::OK).body(body), + None => not_found(), + } + } + + fn download(&self, property_reference: PropertyReference) -> http::Result> { + match self.get_data_url(property_reference) { + Some(data_url) => self.decode_data_url(data_url), + None => not_found(), + } + } + + fn upload(&self, property_reference: PropertyReference, request: Request) -> http::Result> { + match request.body() { + HttpBody::Binary(bytes) => { + debug!("upload binary"); + self.set_data_url_binary(property_reference.clone(), bytes); + } + HttpBody::PlainText(data_url_base64) => { + debug!("upload data url"); + self.set_data_url_base64(property_reference.clone(), data_url_base64); + } + _ => {} + } + self.download(property_reference) + } +} + +#[async_trait] +#[component_alias] +impl WebResourceProvider for BinaryWebResourceProvider { + fn id(&self) -> Uuid { + *ID + } + + fn get_context_path(&self) -> String { + CONTEXT_PATH.to_string() + } + + async fn handle_web_resource(&self, path: String, request: Request) -> http::Result> { + let uri = request.uri(); + debug!("uri: {uri}"); + debug!("path: {path}"); + let search = format!("/{path}"); + debug!("search: {search}"); + let property_reference = self.get_property_reference(search); + if property_reference.is_none() { + return not_found(); + } + let property_reference = property_reference.unwrap(); + debug!("property_reference: {} {:?}", property_reference.property_name, property_reference.entity_instance); + + let method = request.method().as_str(); + debug!("request: {}", request.method()); + + match method { + "GET" => self.download(property_reference), + "POST" => self.upload(property_reference, request), + _ => not_found(), + } + } +} + +fn not_found() -> http::Result> { + Response::builder().status(StatusCode::NOT_FOUND).body(HttpBody::None) +} + +fn filter_by_base64_data_url(s: String) -> Option { + if let Some(prefix) = s.split(',').next() { + // prefix: data:image/png;base64 + if !prefix.starts_with("data:") || !prefix.ends_with(";base64") { + return None; + } + } + Some(s) +} diff --git a/plugins/binary/crates/plugin/types/components/binary_data.json b/plugins/binary/crates/plugin/types/components/binary_data.json new file mode 100644 index 0000000..cb2553f --- /dev/null +++ b/plugins/binary/crates/plugin/types/components/binary_data.json @@ -0,0 +1,12 @@ +{ + "namespace": "binary", + "type_name": "binary_data", + "properties": [ + { + "name": "data_url", + "description": "The data URL contains data items. The URLs are of the form: data:[][;base64], See: https://www.rfc-editor.org/rfc/rfc2397", + "data_type": "string", + "socket_type": "none" + } + ] +} diff --git a/plugins/binary/crates/plugin/types/components/load_binary_data.json b/plugins/binary/crates/plugin/types/components/load_binary_data.json new file mode 100644 index 0000000..b9c80dd --- /dev/null +++ b/plugins/binary/crates/plugin/types/components/load_binary_data.json @@ -0,0 +1,24 @@ +{ + "namespace": "binary", + "type_name": "load_binary_data", + "description": "Loads binary data", + "properties": [ + { + "name": "data_url", + "description": "The data URL contains data items. The URLs are of the form: data:[][;base64], See: https://www.rfc-editor.org/rfc/rfc2397", + "data_type": "string", + "socket_type": "output" + } + ], + "extensions": [ + { + "namespace": "metadata", + "type_name": "dublin-core", + "extension":{ + "title": "Load Binary Data", + "subject": "Loads binary data", + "creator": "Hanack" + } + } + ] +} diff --git a/plugins/binary/crates/plugin/types/components/save_binary_data.json b/plugins/binary/crates/plugin/types/components/save_binary_data.json new file mode 100644 index 0000000..96a5de1 --- /dev/null +++ b/plugins/binary/crates/plugin/types/components/save_binary_data.json @@ -0,0 +1,24 @@ +{ + "namespace": "binary", + "type_name": "save_binary_data", + "description": "Saves binary data", + "properties": [ + { + "name": "data_url", + "description": "The data URL contains data items. The URLs are of the form: data:[][;base64], See: https://www.rfc-editor.org/rfc/rfc2397", + "data_type": "string", + "socket_type": "input" + } + ], + "extensions": [ + { + "namespace": "metadata", + "type_name": "dublin-core", + "extension":{ + "title": "Save Binary Data", + "subject": "Saves binary data", + "creator": "Hanack" + } + } + ] +} diff --git a/plugins/binary/crates/plugin/types/entities/load_binary_data.json b/plugins/binary/crates/plugin/types/entities/load_binary_data.json new file mode 100644 index 0000000..14865b7 --- /dev/null +++ b/plugins/binary/crates/plugin/types/entities/load_binary_data.json @@ -0,0 +1,122 @@ +{ + "namespace": "binary", + "type_name": "load_binary_data", + "description": "Loads binary data", + "components": [ + { + "namespace": "base", + "type_name": "named" + }, + { + "namespace": "core", + "type_name": "action" + }, + { + "namespace": "file", + "type_name": "file" + }, + { + "namespace": "binary", + "type_name": "binary_data" + }, + { + "namespace": "binary", + "type_name": "load_binary_data" + } + ], + "properties": [ + { + "name": "data_url", + "description": "The data URL contains data items. The URLs are of the form: data:[][;base64], See: https://www.rfc-editor.org/rfc/rfc2397", + "data_type": "string", + "socket_type": "output" + } + ], + "extensions": [ + { + "namespace": "flow_editor", + "type_name": "palette", + "extension": { + "content": "Load Binary Data", + "styles": { + "font-size": "12px", + "font-family": "Fira Code", + "padding": "5px" + } + } + }, + { + "namespace": "flow_editor", + "type_name": "shape", + "extension": { + "width": 200, + "socket": { + "width": 60, + "height": 30, + "offset": 5 + }, + "offset": { + "top": "socket.height", + "bottom": "socket.height" + }, + "elements": { + "title": { + "show": true, + "type": "text", + "content": "element.description", + "position": { + "left": 0, + "top": 0, + "width": "shape.width", + "height": "socket.height" + }, + "styles": { + "font-size": "12px", + "fill": "black" + } + }, + "symbol": { + "show": true, + "type": "text", + "content": "Load Binary Data", + "position": { + "left": 0, + "top": 0, + "width": "shape.width", + "height": "shape.height" + }, + "styles": { + "font-family": "Fira Code", + "font-size": "40px", + "fill": "fuchsia" + } + }, + "id": { + "show": true, + "type": "text", + "content": "shape.id", + "position": { + "left": 0, + "top": "shape.height-socket.height", + "width": "shape.width", + "height": "socket.height" + }, + "styles": { + "font-size": "9px", + "fill": "black" + } + } + } + } + }, + { + "namespace": "metadata", + "type_name": "dublin-core", + "extension":{ + "title": "Load Binary Data", + "subject": "Loads binary data", + "creator": "Hanack" + } + } + ] +} diff --git a/plugins/binary/crates/plugin/types/entities/save_binary_data.json b/plugins/binary/crates/plugin/types/entities/save_binary_data.json new file mode 100644 index 0000000..f1caf1e --- /dev/null +++ b/plugins/binary/crates/plugin/types/entities/save_binary_data.json @@ -0,0 +1,122 @@ +{ + "namespace": "binary", + "type_name": "save_binary_data", + "description": "Saves binary data", + "components": [ + { + "namespace": "base", + "type_name": "named" + }, + { + "namespace": "core", + "type_name": "action" + }, + { + "namespace": "file", + "type_name": "file" + }, + { + "namespace": "binary", + "type_name": "binary_data" + }, + { + "namespace": "binary", + "type_name": "save_binary_data" + } + ], + "properties": [ + { + "name": "data_url", + "description": "The data URL contains data items. The URLs are of the form: data:[][;base64], See: https://www.rfc-editor.org/rfc/rfc2397", + "data_type": "string", + "socket_type": "input" + } + ], + "extensions": [ + { + "namespace": "flow_editor", + "type_name": "palette", + "extension": { + "content": "Save Binary Data", + "styles": { + "font-size": "12px", + "font-family": "Fira Code", + "padding": "5px" + } + } + }, + { + "namespace": "flow_editor", + "type_name": "shape", + "extension": { + "width": 200, + "socket": { + "width": 60, + "height": 30, + "offset": 5 + }, + "offset": { + "top": "socket.height", + "bottom": "socket.height" + }, + "elements": { + "title": { + "show": true, + "type": "text", + "content": "element.description", + "position": { + "left": 0, + "top": 0, + "width": "shape.width", + "height": "socket.height" + }, + "styles": { + "font-size": "12px", + "fill": "black" + } + }, + "symbol": { + "show": true, + "type": "text", + "content": "Save Binary Data", + "position": { + "left": 0, + "top": 0, + "width": "shape.width", + "height": "shape.height" + }, + "styles": { + "font-family": "Fira Code", + "font-size": "40px", + "fill": "fuchsia" + } + }, + "id": { + "show": true, + "type": "text", + "content": "shape.id", + "position": { + "left": 0, + "top": "shape.height-socket.height", + "width": "shape.width", + "height": "socket.height" + }, + "styles": { + "font-size": "9px", + "fill": "black" + } + } + } + } + }, + { + "namespace": "metadata", + "type_name": "dublin-core", + "extension":{ + "title": "Save Binary Data", + "subject": "Saves binary data", + "creator": "Hanack" + } + } + ] +} diff --git a/plugins/binary/dynamic_graph/load_binary_data/create.graphql b/plugins/binary/dynamic_graph/load_binary_data/create.graphql new file mode 100644 index 0000000..24c881d --- /dev/null +++ b/plugins/binary/dynamic_graph/load_binary_data/create.graphql @@ -0,0 +1,18 @@ +mutation { + binary { + createLoadBinaryData( + id: "5069fe9b-ad2f-4ff5-9992-0e225a70d2ad" + name: "The Inexor Logo" + filename: "docs/images/inexor_2.png" + data_url: "" + trigger: true + result: {} + ) { + id + name + filename + # Expected: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgA..." + data_url + } + } +} diff --git a/plugins/binary/graphql/get_all_binary_datas.graphql b/plugins/binary/graphql/get_all_binary_datas.graphql new file mode 100644 index 0000000..ea0a85c --- /dev/null +++ b/plugins/binary/graphql/get_all_binary_datas.graphql @@ -0,0 +1,35 @@ +query { + instances { + entities( + components: [ + { + namespace: "binary" + name: "binary_data" + } + ] + ) { + id + label + type { + name + } + components { + namespace + name + } + behaviours { + namespace + name + } + properties( + names: [ + "filename" + "data_url" + ] + ) { + name + value + } + } + } +} diff --git a/plugins/binary/graphql/load_binary_data/create.graphql b/plugins/binary/graphql/load_binary_data/create.graphql new file mode 100644 index 0000000..0df121c --- /dev/null +++ b/plugins/binary/graphql/load_binary_data/create.graphql @@ -0,0 +1,51 @@ +mutation { + instances { + entities { + create( + type: { + namespace: "binary" + name: "load_binary_data" + } + id: "dce4bd25-7b25-4a6a-8567-5429a2b3a101" + properties: [ + { + name: "label" + value: "/io/reactive-graph/logo/:property" + } + { + name: "filename" + value: "docs/images/inexor_2.png" + } + { + name: "trigger" + value: true + } + ] + ) { + id + label + type { + name + } + components { + namespace + name + } + behaviours { + namespace + name + } + properties( + names: [ + "trigger" + "filename" + "data_url" + ] + ) { + name + value + } + } + } + } +} diff --git a/plugins/binary/graphql/load_binary_data/delete.graphql b/plugins/binary/graphql/load_binary_data/delete.graphql new file mode 100644 index 0000000..99bf972 --- /dev/null +++ b/plugins/binary/graphql/load_binary_data/delete.graphql @@ -0,0 +1,7 @@ +mutation { + instances { + entities { + delete(id: "dce4bd25-7b25-4a6a-8567-5429a2b3a101") + } + } +} diff --git a/plugins/binary/graphql/load_binary_data/get.graphql b/plugins/binary/graphql/load_binary_data/get.graphql new file mode 100644 index 0000000..f75cd0a --- /dev/null +++ b/plugins/binary/graphql/load_binary_data/get.graphql @@ -0,0 +1,29 @@ +query { + instances { + entities(id: "f43d0424-f25f-49c0-8c8a-15340b82007c") { + id + label + type { + name + } + components { + namespace + name + } + behaviours { + namespace + name + } + properties( + names: [ + "trigger" + "filename" + "data_url" + ] + ) { + name + value + } + } + } +} diff --git a/plugins/binary/graphql/load_binary_data/update.graphql b/plugins/binary/graphql/load_binary_data/update.graphql new file mode 100644 index 0000000..e4cc8e1 --- /dev/null +++ b/plugins/binary/graphql/load_binary_data/update.graphql @@ -0,0 +1,43 @@ +mutation { + instances { + entities { + update( + id: "dce4bd25-7b25-4a6a-8567-5429a2b3a101" + properties: [ + { + name: "filename" + value: "/tmp/d715b2e8-da53-47eb-a217-fbe715292e60.png" + } + { + name: "trigger" + value: true + } + ] + ) { + id + label + type { + name + } + components { + namespace + name + } + behaviours { + namespace + name + } + properties( + names: [ + "trigger" + "filename" + "data_url" + ] + ) { + name + value + } + } + } + } +} diff --git a/plugins/binary/graphql/load_binary_data/update_add_component_fs_notify.graphql b/plugins/binary/graphql/load_binary_data/update_add_component_fs_notify.graphql new file mode 100644 index 0000000..e9b73ea --- /dev/null +++ b/plugins/binary/graphql/load_binary_data/update_add_component_fs_notify.graphql @@ -0,0 +1,38 @@ +mutation { + instances { + entities { + update( + id: "dce4bd25-7b25-4a6a-8567-5429a2b3a101" + addComponents: [ + { + namespace: "file" + name: "fs_notify" + } + ] + ) { + id + type { + name + } + components { + namespace + name + } + behaviours { + namespace + name + } + properties( + names: [ + "trigger" + "filename" + "data_url" + ] + ) { + name + value + } + } + } + } +} diff --git a/plugins/binary/graphql/load_binary_data/update_remove_component_fs_notify.graphql b/plugins/binary/graphql/load_binary_data/update_remove_component_fs_notify.graphql new file mode 100644 index 0000000..494ac92 --- /dev/null +++ b/plugins/binary/graphql/load_binary_data/update_remove_component_fs_notify.graphql @@ -0,0 +1,38 @@ +mutation { + instances { + entities { + update( + id: "dce4bd25-7b25-4a6a-8567-5429a2b3a101" + removeComponents: [ + { + namespace: "file" + name: "fs_notify" + } + ] + ) { + id + type { + name + } + components { + namespace + name + } + behaviours { + namespace + name + } + properties( + names: [ + "trigger" + "filename" + "data_url" + ] + ) { + name + value + } + } + } + } +} diff --git a/plugins/binary/graphql/save_binary_data/create.graphql b/plugins/binary/graphql/save_binary_data/create.graphql new file mode 100644 index 0000000..47b3902 --- /dev/null +++ b/plugins/binary/graphql/save_binary_data/create.graphql @@ -0,0 +1,46 @@ +mutation { + instances { + entities { + create( + type: { + namespace: "binary" + name: "save_binary_data" + } + id: "d715b2e8-da53-47eb-a217-fbe715292e60" + properties: [ + { + name: "filename" + value: "/tmp/d715b2e8-da53-47eb-a217-fbe715292e60.png" + } + { + name: "trigger" + value: false + } + ] + ) { + id + type { + name + } + components { + namespace + name + } + behaviours { + namespace + name + } + properties( + names: [ + "trigger" + "filename" + "data_url" + ] + ) { + name + value + } + } + } + } +} diff --git a/plugins/binary/graphql/save_binary_data/update.graphql b/plugins/binary/graphql/save_binary_data/update.graphql new file mode 100644 index 0000000..94c73d5 --- /dev/null +++ b/plugins/binary/graphql/save_binary_data/update.graphql @@ -0,0 +1,43 @@ +mutation { + instances { + entities { + update( + id: "d715b2e8-da53-47eb-a217-fbe715292e60" + properties: [ + { + name: "data_url" + value: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUoAAADGCAYAAAC0LMkSAAAACXBIWXMAAAAAAAAAAQCEeRdzAAAQAElEQVR4nO2dCbhd47nHv5OJREZEKi0pah6CKKKtmYqiRaQ1REmluJSYaalqmtZQqeGqtlpDeq+gUSW5WnJ5IiSCjJeQOZGTc2Jo1SwkvPd9z7e3PZy991p7Wv/3y3738/yek5y11rf+a+33/Z9vrW9yROQMwzCM4sAFGIZhaAcuwDAMQztwAYZhGNqBCzAMw9AOXIBhGIZ24AIMwzC0AxcQEpV+qKWNJqYTM4A5jrmReYJZxrzDrGU+Y8gwIpA4WcO8wcxj7mcuZvZjejEdmcrjVUGuaQMuICTKDrhVbQbZhenLHMnczsxnPlCQbMb6xTryxil/fC9hBjLdmQ5mlDXIfbSAkCgr2OSv+irXn3+eyEwiX2tEJ5PROCwh/9SyN9OTyqhhovNMI3ABIRHTIF0qMA9h7mX+rSBpjMbkU+Zl5gpmW6aTGWWFuY8WEBKRAdbaZpJfYi5gFqUCFZ0shiHvMx9iDuOnnK5mlBXkPlpASMSoTe7E3Ma8rSA5DCOfOWyUI/hnDzPKMnMfLSAkShiksBv51sePFCSEYRRjOXMhU7Rmic4zjcAFhEQJo9yGeZj8Iw46EQwjilbyr4c2NKOMmftoASFRxCQ3Yx5gPlaQAIYRB+mHKWZ5KhXoPoTOM43ABYREAZPcgLmerCZphMli5htmlDFyHy0gJAoY5TCy7j9GuEjNcjKzsRllRO6jBYREnkl+gaQVER/shlEN8sroGjPKiNxHCwiJPKO8gayfpLF+sJrpb0ZZIvfRAkIiyyQ3ZV5TEOCGUSvGUaphB51nGoELCImUSXZgxioIbMOoJdL/dyszyiK5jxYQEimjlJmA/qkgsA2jlkjDzlUk0wEqyDVtwAWERMoojyc/pRU6sA2j1iwnea2kINe0ARcQFC2uM/kROOiANox6cRg8zxQCFxAULW4LsgkvjPWbG+B5phC4gKCQv7b4QDaMejIHnmcKgQsIihZ3qYJANox68iE8zxQCFxAULW68gkA2jPqCzjOFwAUERYubDQ9iw6g36DxTCFxAUPihXvhANox6gs4zhcAFBIW8v0EHsWHUG3SeKQQuIChsEgyjEUDnmULgAoICHcCGkQToPFMIXEBQoAPYMJIAnWcKgQsICnQAG0YSoPNMIXABQYEOYMNIAnSeKQQuICjQAWwYSYDOM4XABQQFOoANIwnQeaYQuICgQAewYSQBOs8UAhcQFOgANowkQOeZQuACggIdwIaRBOg8UwhcQFCgA9gwkgCdZwqBCwgKdAAbRhKg80whcAFBgQ5gw0gCdJ4pBC4gKNABbBhJgM4zhcAFBAU6gA0jCdB5phC4gKBAB7BhJAE6zxQCFxAU6AA2jCRA55lC4AKCAh3AhpEE6DxTCFxAUKAD2DCSAJ1nCoELCAp0ABtGEqDzTCFwAUGBDmDDSAJ0nikELiAo0AFsGEmAzjOFwAUEBTqADSMJ0HmmELiAoEAHsGEkATrPFAIXEBToADaMJEDnmULgAoICHcCGkQToPFMIXEBQoAPYMJIAnWcKgQsICnQAG0YSoPNMIXABQYEOYMNIAnSeKQQuICjQAWwYSYDOM4XABQQFOoANIwnQeaYQuICgQAewYSQBOs8UAhcQFOgANowkQOeZQuACggIdwIaRBOg8UwhcQFCgA9gwkgCdZwqBCwgKdAAbRhKg80whcAFBgQ5gw0gCdJ4pBC4gKNABbBhJgM4zhcAFBAU6gA0jCdB5phC4gKBAB7BhJAE6zxQCFxAU6AA2jCRA55lC4AKCAh3AhpEE6DxTCFxAUKAD2DCSAJ1nCoELCAp0ABtGEqDzTCFwAUGBDmDDSAJ0nikELiAo0AFsGEmAzjOFwAUEBTqADSMJ0HmmELiAoEAHsGEkATrPFAIXEBToADaMJEDnmULgAoICHcCGkQToPFMIXEBQoAPYMJIAnWcKgQsICnQAG0YSoPNMIXABQYEOYMNIAnSeKQQuICjQAWwYSYDOM4XABQQFOoANIwnQeaYQuICgQAewYSQBOs8UAhcQFOgANowkQOeZQuACggIdwIaRBOg8UwhcQFCgA9gwkgCdZwqBCwgKdAAbRhKg80whcAFBgQ5gw0gCdJ4pBC4gKNABbBhJgM4zhcAFBAU6gA0jCdB5phC4gKBAB7BhJAE6zxQCFxAU6AA2jCRA55lC4AKCAh3AhpEE6DxTCFxAUKAD2DCSAJ1nCoELCAp0ADcAK19wdNowRyNOdDTqDEfvLc7d/uRfHJ3+Xb99zGWO1jXjNa93oPNMIXABQYEO4AZg9mOOo9KzSR9H/5yfu/3WMZnt++zhaO1KvOb1DnSeKQQuICjQAdwAzHk8Y4R9N2lvlLf9MrN9v73MKOsCOs8UAhcQFOgAbgCijPKB3zvafWdHe+7qH9HXmVHWHnSeKQQuICjQAVwOrY4+W+WNZG0K+bf8TrZFHss/P23OPT5dhvBpc2bf2HqKlLk2q7y5k0sb5esvOpr5mOeVp1PXU+KcVOo6mrPuR9zraATQeaYQuICgQAdwCRY+4+jpv3neZDNpnu0bPib8wdH9v/M8+EdHj93LZvS/jt5ZWLicT151tOw5R1MfcvTI3Y7+knW88Beu0T14h6NH/+xo+kRHr870x5QyK2mQEVOb8ldf5oS8MqWWOOkeRy/8g/d5sLRRts5hbY/wdfK55z5Z3CjXLHe0dIajZx529D/jvOYH8s750J8cPT7e0Syuxb72f1nm3+ig80whcAFBgQ7gYqx29LOLHO27p6PBgxyNvdrR2ac6GrSbo623dDTgS46+zGzzZUe77eRoyEGORl/KJvdCbjlieBPYUIYf72gfLmuHr/jj5dgBKbbagssZ4Gjn7R19fW/fAj3+t47eXdxel5jY4umOrv2xo+OGONp7d0fbb5Mqc4tMmfLvHflcB3+NH6e/W9ooxWTlOvfl6zzjpMKP3s2zHN3+K0cnHevfY+60rdeccx2sYdutHA3k+3HY/o7OP4MNlc3/4xUKvk806DxTCFxAUKADuIRRnnJ8xmDEeDbokvl/IXr3dDRqpKOPlmXKmco1vp22c9SxQ+ljs+nY0RvO765z7R5fX5/n6ISjHW3c21FTU7zyNtwgojFnTGb74D3bN+a8wbXps7/vqH+/+OdMn1fefd71G+tyBM8zhcAFBAU6gEsY5fChuYn/hb6Ovv1NR6ee4JFa4nFH+hplep8+vRzN/HuqDDa5kSdltvXq4ejIQ7wBp8tog89z4ne4Vnqwr6Gl999lB0f/XpCr63fXOurUyW/v1NEb0fFH+jKk5tjGMH+OYw73hpt9DZGt3oPyjJKv4Tc/c9R9o8w+e+ziaOhR/pw513GCP++3DvWmmt7/K6xhxfMKvlMzSlXABQQFOoBjGuUGXDu6c6yjRdP48XqWZ8VMfgye4WuN8uib3ve3v8qUIY++XTf0yKPogmn+uHQZaZbzI/uCp/17SjFbKadzZ0dTJmQ0yTtCeTRPn+c7Rzh6dqKjJTP8e82VszxpbaJ18n3+Ublio2zxj/fp7ccOyZyz0HXI7+TdrjzOb9HfHyO10N9fr+A7NaNUBVxAUKADOKZRHrSfo/eWFN5XHivPyKo5/uT81LZW36Dy51sc3X2Toxef8O8d317ga4pp5P/SOCPvMz/m43bZPlPW76/LnEcaR3r3ymx7+G5Hn5ZqoW7xpjfulsqN8t2Fjjbd2G8Ts5driDqnsIavZeTJmXKHHRPRmr6+g84zhcAFBAU6gIuRZ5Tn/cB3xSm4b6tv+Enve/HZmW1SC5RW8Uv/w9F3j/GPpUcc6OjwAzIccZCjow9zNOJ7bIw3ONpx20xZY3+WKUtanNOP3U3MvCfjXcvzj1ZulK2zHW3UzW+T96JrS7XG590T0f75u89BDd4/E51nCoELCAp0ABcjzygvOqvEvmwK11/lqMdG3lSuzKpR3vBTNpg+/BjdyTfodEjTlEXqd9KI06WLf/f4uVFenTnPwml+H/m97D//qXjXUtbInDyjbH7B1yTTxxb9Y1GA7HL3GliGya6PoPNMIXABQYEO4GKUY5TMqlmOZkzypLsIvc+P05ttmilDTFGMTkyzSxbyf6kpivnltyqXNMqp8a6lGqNcOTPLKDcu7x7mGOVuZpRGLnABQYEO4GKUaZRt3XhWp0h16ZFH3nTtsFtXR1f8yPePlA7iE+/JIO8apRO6dAc6c3hud55so1w0Pcso2VBfmhLvWmb9o3KjlD8Aol22ybvKct4z3vqLTLlftRqlM3KBCwgKdAAXo1yjLICMUEnXELfbhn/3WjTr2Ih22LawUUqn765dM9umPRJPx9//q3KjlBFJPXv4bfLzrZdjXj//sfjpBZlypQN6Q4/SQeeZQuACggIdwMWogVFK154OqY7m0p/xX4scfbTcj1TJZs0K/3tpVW99yY+oKWSU0jIuI2LS26QB6XXe/8Nlvoz8Mj9Y6h+dpV9lpUb5yQo/4ka2SW32P8c4eoOP/7DAdaTP+z6fd/lzjvbfN1OuNGbBv1MzSlXABQQFOoDraJSLnsm835MO21df6Oiemx3dd3vuuOzx/P9xN3sTktb1bl0LG6U89l45KrNt836OLjnb9++877e5Zco5pGuRmGS3DavoR7nadyxP14w34+MvP9ePtsm/DuHe23w/Umnh79I589rh6YcUfKdmlKqACwgKdADHNcozyy9DugbJyJl0GdJoIxPnygifbPr19b/v3q19Y86NV+eWKZ2599g1U1OVWp50UO9XoMye3X152cMno4xycIEO59LBfM+sc0rDk3QVyj+nII1XPbr77kvpPxAyYueDIn1QGwZ0nikELiAo0AFcwiilE/lGXTMNMWWX0epre7vt6LsNpbsFNeXRIWVmMpZcamxiQrK/nPeWX+SWKZ3bHxvvh07K+HPZTxqM0i3mTVldjqQ2K/vIsEvZT5DJK/6V955RRs3IuWS7jCTKN0o5pzQ6yVBJGYEk3aA6d2p/PekuTnIdYvxirlITl5mTGrqzuRllQeACggIdwCVM7m93Ohp9iaOfX+KHAlZSzvtL/Aw611zsZx8S881HRrDIpBPyHk9m6JHH7fR5Z0xsX6b0ZXxlqm9Bl33OG+Hoh6fklnnWcN+fUx6F5z3hZzaSMqWGKu8us8t74VEu52K//a6xhRtdxDxliKU8Xv/yckcX/NCfY2TedZxzGj+an+Po1tF8z+73E2rYvJQS6gpyTRlwAUGBDuASfMiG8vZCT/aMQOUiNTIZqrhqTmY8dg6z+TbMdfTmS/480qiTPq88vhcst9Wbl+yzep6fKzO7TDmX1BxlWKQMOUyX9+6i9kMQpREmvV3OXbT21+pH17yzyA+nbHc96euY7+9dw9cis0HnmULgAoICHcBJ0hpBrctGXQ/6PmsEnWcKgQsICnQAG0YSoPNMIXABQYEOYMNIAnSeKQQuICjQAWwYSYDOM4XABQQFOoANIwnQeaYQuICgQAdwCT5udrRmpQ4+bm7fVDORwgAAC/hJREFUiiwty9KKXS4yFLLWLdJSnnSFqkTP+wUWUasXa1eVd9/jTFJsRlkZcAFBocAQiyF9BqVfowZkuGDOxLcy1+VVfq2dcvnhyY7+Nb+290qW6v3RiMr0tI0DX13f7/KzVBcp6Q8r6w7FuecyFHPZszXSgM4zhcAFBIUCQyyGjKiRkSYakIXGcvpUvuboqENzhzvGRUbQyLjycibhjfNHJT0FXLnIMr1tsyfV6XuUvqQy9POaixx9YbP491xGG8k65WaU9QEuICgUGGIxdt2hssSvBzJrUL5RHnNY5eXJujyF1g2vBFkf5/ADKtci97keRil/CKSj/6RxfkXKqOWGC/HXP9ZIDzrPFAIXEBQKDLERjVJm9nn4ruprlXK8rEKZnrNSi1GubfbDPGW4pUxx11ShNjPK+gEXEBQKDLERjVL4xj7+3WI19+iTlX6Cjmp01NQoWx29t8jRI/c4OuGo3PXIzSh1ARcQFAoMsVGNUqZLq3SyjzTzpzjq1VOHUUrtdtkMR2Mu8++X09PCmVHqBC4gKBQYYqMapfC9bzv6aEVl90dqk+ee3n4OzcSNsjW1LPB4R0OPyqxDXgvMKOsHXEBQKDDERjZKebc4vcBUbnGQGdxl7sxqNVRllGySq+c6uu4nvpz0uudmlPqBCwgKBYZYrVF2SE26W08G7lwfoxRknsxKZv2RR9xanL9So/yUNT87yb+LrGUt0owyGeACgkKBIVZrlIP38pPoyiS59UK6uOR0OK+hUfbv59/tlXNvWrkWt80AkFG2+tE8t/3K0XZbZ9bmiYusISRr+nSOUfs0o6wfcAFBocAQqzVKec/3Ce//SXP9kKF3OcMOYxrl5ptF7yPvGNtGx8StVbb6Dutx3k1u2b/GRrna0YKpjk45LrNwWzlIVyFZQ33u5Nz1080okwcuICgUGGK1RnkiG2XiE9bGNEoZrrhFDLOSfWQES5xzy8zqg3aNLlMWGrvmkhoaZas3OalFlmuQMtJG1vxZMo3/4IjZPmNGiQYuICgUGOL6bJQ/vdDRtT+O3k/es/7h+ngd0Cfc4Rc0iypT1s/5863VG6V0Hn/1eb82UNeu0eXlX5e8WpC1gqR/Zfp7kvV/zCixwAUEhQJDXJ+N8qoLHK1gk+kdo6+jrNj41oLS55VXANJRPaosWalx1mN+HfNKjTI9kcXEux3tt1f5tUjpbH7w1x099aCjdXmzAJlR4oELCAoFhli1UX7H1X32m4qNcpQ3CVk2NuqdomyXlSeL1Srl97P+4Ze1jTrvqUN9P8tKjVJeAyya5vXLeuHlGKQ8Zm/Fpn/ZORxes13BP2JmlHjgAoJCgSFWa5RHs2EtnsGJPb0+tMwpMH9kGUYpRiG1SnlnGLW/rOtdbFjjR8sdHXtEdBliQNMf8eetxChlso5J9zgacnD5LdrptcllNqMPl7miNX0zSjxwAUGhwBCrNUppCJG+fEPrwbd8f8V2E8iWaZRSqxxxYnStsjMb09//u/D9mDM5nnEdeUhq7fAKjXLKhPK7Hsl1DfiSnxNT1jGPmnDXjBIPXEBQKDDEao2y3gw5iBO/OU9fmUbZZnSPx6tVyquENStyzyeP0ReMjFGj6+ro6YdSx1VilHzMH28o7/5Ih/wD9uXjbnT01ssu1vtiM0o8cAFBocAQtRvlkQfXxiilljV8aPQxMiyx7dE563wvP+UnvY069pCve1Otxijv+HX8e9N3E0dnneromYfjd28yo9QBXEBQKDDERjFKYcqDjnrFmDty5MlZx/HPay6OPqYb1yYfym4MqqNRSrefPXZxdPu1jlbOLH8NIDNKPHABQaHAEBvJKKWBY9jR0cd9cXNHy5/zx8hwxR23jT7mgMF+gbHPNdbJKKXbz/Dj/SP++0tdRV2zFsbtcG5LQdQNuICgUGCIjWSUwuPjo+dqlO2XnM3n5f1vuia6g3mHJkfjbsnTWCej3HqAo1Ej/eJqv766Mi4/N95MQ6cNyz3upp87ejuir6kZZTzgAoJCgSE2mlHKhBLyLjHqWBnR8uaLjvbcJXrfvQY6euuVPI11Mkppee/dqzp6do9376W7UfZx/fr6rlZmlNUDFxAUCgxRu1F+88DaGqW8Q3zi/uhVE6VWKY0/XWIsynXn2AId1RNozEkamYhj2XMVxBM6zxQCFxAUCgyxWqOU/nsnHVvZmtZxuO7K6juc51/bB8sdbb9Nbcxjc655vvFSgXtoRmlGWQK4gKBQYIjVGqVMsya1qc9W1Y92+qo0SkFGr8SZk7EU0tH7ltFF7qEZpRllCeACgkKBIVZrlKonxShhlNLfceCO1RlHv00d/fPFIhrNKM0oSwAXEBQKDLFRjVJ+f/PoyteZ6djBTzxRdLigGaUZZQngAoJCgSE2rFEyb3BtcNcKa5VbftHRqtklNFY6hPHXvruRNCbVjZgrRzbl6ZBW8OVmlDUBLiAoFBhiIxulbJPGonKXnG1izvtBdNmVTIrx2L2+S9S3DqkfBw6OZ5aDdss97rghjl6bV8H3hc4zhcAFBIUCQ2xoo2SWPuto6y3LM0pZi0fWnSmpsUKjfGeBn4uynky+30+mEaVNFjBrm+4uddySZ8sbU25GWRy4gKBQYIiNbpTrmh39PMbaNtnIErdrV0ZorNAo08fWk4XTyhjCmH98Jd8XOs8UAhcQFAoMsdGNUpCxzzJrUJzr7dnD0fSJMTRWY5R1Ju6kGA/apBh1Ay4gKBQYohmlf5y86Mx47yplmYe22cPNKM0oqwAuICgUGKIZpefV5+LVKvPnqjSjjAE6zxQCFxAUCgyxWqP8Hsgojzo0WttPzo+vTfpDfv+E0uXJejSxapMpo7z7pmiNO2/vIEYZpzHHjLJ+wAUEhQJDLMbXvupokz6lkRpYziS3SbHa0ZXn++VYi3EQm9pdY8vT9uKTfhKOQuUdur+j5x+Nt/Z3G61+SjfRUUrnGSe6xI1y8XQ/Rr3Ud9unl6OJ99TonOg8UwhcQFAoMMRivDLV0dzHSyPr0CyfgdG3ZjnX7paU5pMV5ZUpJvjR0iLlLS3DJFNIy3iURjkf4t5J96ao7/bf+VPHVQo6zxQCFxAULW4d0gxLImt1R3U1Se+D1mqUT5zvtlbnQueZQuACgqLFfQBPGMOoN+g8UwhcQFC0uFXwIDaMeoPOM4XABQRFi3seHsSGUW/QeaYQuICgaHHj4EFsGPXlM3ieKQQuICha3CgFgWwY9eQ9eJ4pBC4gKFrcgQoC2TDqyQx4nikELiAoWtzmzJsKgtkw6sVoeJ4pBC4gKFpcJ2Y8yXscfEAbRq35lNkfnmcKgQsICflwIA0hzR3PDaNyXqZVrjc6zzQCFxASKaPcmFmtIKgNo5ZIbfICNsomdJ5pBC4gJFJG2cRcRfb4baxfvMf0b4txBbmmDbiAkGgLotVtZtmDWakguA2jVtzMdDCjLJL7aAEhkf3hoLqS/OMKOsANo1peZfp8HtsKck0bcAEhkWeUvZlpZI/gRtisYUblxLaCXNMGXEBI5H84wL7JvKEg2A2jEqT3xl+ZjcwoI3IfLSAkChhlJ1rlruCf7ysIesMol3nM7u3iWkGuaQMuICQKfdgoe3Gw3cF8qCDwDSMO8rpoGXMMtRaIaQW5pg24gJAo9iE/tFFmFrKJfQ3tiEkuZU5nOheMZwW5pg24gJAoYZTCV5g/MO8oSAbDKMZ8ZgTTqWg8K8g1bcAFhETUh4NvK2YM8xpZa7ihC+nKNpU5ntmgZBwryDVtwAWERJwPB2Ff5jTmBWatggQxDHnK+RMzmOkSGcMKck0bcAEhEffDwdiV2Zu5hWydHQPHx8x0ZiSzBaVG3phRVpD7aAEhUc6H/JjwTcn3tbyTaSEbyWMkgxikPNFcyuzMdGPix66CXNMGXEBIVPIhP4eljOLZh7maeYp8J3V7LDdqiXRPW0x+vtRTma3JG2RT2TGrINe0ARcQEpV+qOXzGmZHpg/5d0XnMXcxTzOLyD+irzaMmMj4bOkwPom5nhnGbEer3Ab8swOVUYM0o4yR+2gBhmEY2oELMAzD0A5cgGEYhnbgAgzDMLQDF2AYhqEduADDMAztwAUYhmFo5/8BcXNupa4gDBwAAAAASUVORK5CYII=" + } + { + name: "trigger" + value: true + } + ] + ) { + id + type { + namespace + name + } + components { + namespace + name + } + behaviours { + namespace + name + } + properties( + names: [ + "trigger" + "filename" + "data_url" + ] + ) { + name + value + } + } + } + } +} diff --git a/plugins/file/README.md b/plugins/file/README.md new file mode 100644 index 0000000..4900b67 --- /dev/null +++ b/plugins/file/README.md @@ -0,0 +1,17 @@ +# Plugin File + +## Components + +| Name | Description | Property | Data Type | Socket Type | +|-----------|----------------------------------|----------|-----------|-------------| +| file | Represents a file | filename | string | input | +| fs_notify | Triggers if the file was changed | filename | string | input | +| | | trigger | bool | output | + +## Platform Compatibility + +| Platform | Compatibility | +|----------|---------------| +| Linux | ✓ | +| MacOS | ✓ | +| Windows | ✓ | diff --git a/plugins/file/crates/model/Cargo.toml b/plugins/file/crates/model/Cargo.toml new file mode 100644 index 0000000..e70b669 --- /dev/null +++ b/plugins/file/crates/model/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "reactive-graph-sys-file-model" +description = "Reactive Graph - SYS - File - Model" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +readme = "../../../../README.md" + +[dependencies] +lazy_static = { workspace = true } +paste = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +strum_macros = { workspace = true } + +reactive-graph-behaviour-model-api = { workspace = true } +reactive-graph-graph = { workspace = true } +reactive-graph-reactive-model-api = { workspace = true } +reactive-graph-reactive-model-impl = { workspace = true } +reactive-graph-runtime-model = { workspace = true } + +[lib] +crate-type = ["lib"] diff --git a/plugins/file/crates/model/src/component/file.rs b/plugins/file/crates/model/src/component/file.rs new file mode 100644 index 0000000..3d6b592 --- /dev/null +++ b/plugins/file/crates/model/src/component/file.rs @@ -0,0 +1,21 @@ +use std::path::PathBuf; + +use crate::NAMESPACE_FILE; +use reactive_graph_graph::component_model; +use reactive_graph_graph::component_ty; +use reactive_graph_graph::properties; + +properties!(FileProperties, (FILENAME, "filename", "")); + +component_ty!(COMPONENT_FILE, NAMESPACE_FILE, COMPONENT_NAME_FILE, "file"); + +component_model!( + File, + data filename string, +); + +pub trait FilePath: File { + fn get_path(&self) -> Option { + self.get_filename().map(PathBuf::from) + } +} diff --git a/plugins/file/crates/model/src/component/fs_notify.rs b/plugins/file/crates/model/src/component/fs_notify.rs new file mode 100644 index 0000000..5c6cca7 --- /dev/null +++ b/plugins/file/crates/model/src/component/fs_notify.rs @@ -0,0 +1,14 @@ +use reactive_graph_behaviour_model_api::behaviour_ty; +use reactive_graph_behaviour_model_api::component_behaviour_ty; +use reactive_graph_graph::component_ty; +use reactive_graph_reactive_model_api::entity_model; +use reactive_graph_runtime_model::Action; + +use crate::NAMESPACE_FILE; + +component_ty!(COMPONENT_FS_NOTIFY, NAMESPACE_FILE, COMPONENT_NAME_FS_NOTIFY, "fs_notify"); +behaviour_ty!(BEHAVIOUR_FS_NOTIFY, NAMESPACE_FILE, BEHAVIOUR_NAME_FS_NOTIFY, "fs_notify"); +component_behaviour_ty!(COMPONENT_BEHAVIOUR_FS_NOTIFY, COMPONENT_FS_NOTIFY, BEHAVIOUR_FS_NOTIFY); + +entity_model!(FsNotify, get trigger bool, set filename string); +impl Action for FsNotify {} diff --git a/plugins/file/crates/model/src/component/mod.rs b/plugins/file/crates/model/src/component/mod.rs new file mode 100644 index 0000000..8d1ff53 --- /dev/null +++ b/plugins/file/crates/model/src/component/mod.rs @@ -0,0 +1,5 @@ +pub use file::*; +pub use fs_notify::*; + +pub mod file; +pub mod fs_notify; diff --git a/plugins/file/crates/model/src/lib.rs b/plugins/file/crates/model/src/lib.rs new file mode 100644 index 0000000..4b86f8f --- /dev/null +++ b/plugins/file/crates/model/src/lib.rs @@ -0,0 +1,5 @@ +pub use component::*; + +pub mod component; + +pub const NAMESPACE_FILE: &str = "file"; diff --git a/plugins/file/crates/plugin/.run/Install Plugin File.run.xml b/plugins/file/crates/plugin/.run/Install Plugin File.run.xml new file mode 100644 index 0000000..029754b --- /dev/null +++ b/plugins/file/crates/plugin/.run/Install Plugin File.run.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/plugins/file/crates/plugin/Cargo.toml b/plugins/file/crates/plugin/Cargo.toml new file mode 100644 index 0000000..0fa6ac5 --- /dev/null +++ b/plugins/file/crates/plugin/Cargo.toml @@ -0,0 +1,56 @@ +[package] +name = "reactive-graph-sys-file" +description = "Reactive Graph - SYS - File" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +readme = "../../../../README.md" + +[package.metadata.deb] +name = "libreactive-graph-sys-file" +depends = "reactive-graph, libreactive-graph-plugin-base, libreactive-graph-plugin-trigger" +assets = [ + ["target/release/libreactive_graph_sys_file.so", "usr/share/reactive-graph/default/plugins/installed/libreactive_graph_sys_file.so", "755"], +] + +[dependencies] +async-std = { workspace = true } +async-trait = { workspace = true } +crossbeam = { workspace = true } +log = { workspace = true, features = ["std", "serde"] } +log4rs = { workspace = true, features = ["console_appender", "file_appender", "toml_format"] } +notify = { workspace = true } +rust-embed = { workspace = true, features = ["debug-embed", "compression"] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +shellexpand = { workspace = true } +springtime-di = { workspace = true, default-features = false, features = ["threadsafe", "derive"] } +uuid = { workspace = true, features = ["serde", "v4"] } + +reactive-graph-behaviour-model-api = { workspace = true } +reactive-graph-behaviour-model-impl = { workspace = true } +reactive-graph-graph = { workspace = true } +reactive-graph-plugin-api = { workspace = true } +reactive-graph-reactive-model-api = { workspace = true } +reactive-graph-reactive-model-impl = { workspace = true } +reactive-graph-runtime-model = { workspace = true } +reactive-graph-type-system-api = { workspace = true } + +reactive-graph-sys-file-model = { version = "0.10.0", path = "../../crates/model" } + +[dev-dependencies] +reactive-graph-graph = { workspace = true, features = ["test"] } + +[lib] +# Plugins use crate-type cdylib +# https://doc.rust-lang.org/reference/linkage.html +# https://users.rust-lang.org/t/what-is-the-difference-between-dylib-and-cdylib/28847/3 +crate-type = ["cdylib"] + +[package.metadata.cargo-post.dependencies] +toml = "0.8" +serde = { version = "1.0", features = ["derive"] } +glob = "0.3" diff --git a/plugins/file/crates/plugin/build.rs b/plugins/file/crates/plugin/build.rs new file mode 100644 index 0000000..8f7525a --- /dev/null +++ b/plugins/file/crates/plugin/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rerun-if-changed=types"); +} diff --git a/plugins/file/crates/plugin/post_build.rs b/plugins/file/crates/plugin/post_build.rs new file mode 100644 index 0000000..3a1ed28 --- /dev/null +++ b/plugins/file/crates/plugin/post_build.rs @@ -0,0 +1,42 @@ +use serde::Deserialize; +use std::env; +use std::fs; +use std::path::PathBuf; + +#[derive(Deserialize)] +struct Deployment { + pub target_dirs: Vec, +} + +fn main() { + match fs::read_to_string("./.deployment.toml") { + Ok(toml_string) => { + let deployment: Result = toml::from_str(&toml_string); + match deployment { + Ok(deployment) => { + let mut crate_out_dir = env::var("CRATE_OUT_DIR").unwrap(); + crate_out_dir.push_str("/libreactive_graph_plugin_file.*"); + for target_dir in deployment.target_dirs { + for entry in glob::glob(crate_out_dir.as_str()).unwrap() { + if let Ok(source_path) = entry { + let file_name = source_path.file_name().unwrap().to_str().unwrap(); + if file_name.ends_with(".so") || file_name.ends_with(".dll") { + let mut target_path = PathBuf::from(&target_dir); + target_path.push(file_name); + println!("Copy plugin from {} to {}", source_path.display(), target_path.display()); + let _ = fs::copy(source_path, target_path); + } + } + } + } + } + Err(e) => { + eprintln!("Failed to parse .deployment.toml: {}", e); + } + } + } + Err(e) => { + eprintln!("Could not read .deployment.toml: {}", e); + } + } +} diff --git a/plugins/file/crates/plugin/src/behaviour/component/fs_notify.rs b/plugins/file/crates/plugin/src/behaviour/component/fs_notify.rs new file mode 100644 index 0000000..1e4d71e --- /dev/null +++ b/plugins/file/crates/plugin/src/behaviour/component/fs_notify.rs @@ -0,0 +1,179 @@ +use log::trace; +use reactive_graph_behaviour_model_api::behaviour_validator; +use reactive_graph_behaviour_model_api::prelude::*; +use reactive_graph_behaviour_model_impl::entity_behaviour; +use reactive_graph_graph::prelude::*; +use reactive_graph_reactive_model_impl::ReactiveEntity; +use serde_json::json; +use uuid::Uuid; + +use reactive_graph_sys_file_model::FileProperties::FILENAME; +use reactive_graph_runtime_model::ActionProperties::TRIGGER; + +use std::path::Path; +use std::time::Duration; + +use crossbeam::channel::unbounded; +use notify::Config; +use notify::Event; +use notify::RecommendedWatcher; +use notify::RecursiveMode; +use notify::Watcher; + +entity_behaviour!(FsNotify, FsNotifyFactory, FsNotifyFsm, FsNotifyBehaviourTransitions, FsNotifyValidator); + +behaviour_validator!(FsNotifyValidator, Uuid, ReactiveEntity, TRIGGER.as_ref(), FILENAME.as_ref()); + +impl BehaviourInit for FsNotifyBehaviourTransitions {} + +impl BehaviourConnect for FsNotifyBehaviourTransitions { + fn connect(&self) -> Result<(), BehaviourConnectFailed> { + if let Some(filename) = self.reactive_instance.get(FILENAME).and_then(|v| v.as_str().map(String::from)) { + let filename = shellexpand::tilde(&filename); + let path = Path::new(filename.as_ref()).to_owned(); + + // TODO: disconnect -> stopper + // let (stopper_tx, stopper_rx) = unbounded(); + let (notify_tx, notify_rx) = unbounded(); + + let mut watcher: RecommendedWatcher = RecommendedWatcher::new( + move |result: Result| { + let _ = notify_tx.send(result); + }, + Config::default(), + ) + .map_err(|_| BehaviourConnectFailed {})?; + watcher.watch(&path, RecursiveMode::NonRecursive).map_err(|_| BehaviourConnectFailed {})?; + + let reactive_instance = self.reactive_instance.clone(); + async_std::task::spawn(async move { + loop { + if let Ok(Ok(_notify_event)) = notify_rx.try_recv() { + trace!("{:?} has changed", &path); + reactive_instance.set(TRIGGER, json!(true)); + } + async_std::task::sleep(Duration::from_millis(1000)).await; + // TODO: disconnect -> stopper + // match stopper_rx.try_recv() { + // // Stop thread + // Ok(_) => break, + // Err(_) => std::thread::sleep(Duration::from_millis(1000)), + // } + } + // TODO: disconnect -> unwatch + // if let Err(err) = watcher.unwatch(&path) { + // error!("Failed to unwatch {:?}: {:?}", &path, err); + // } + }); + } + + // let reactive_instance = self.reactive_instance.clone(); + // self.property_observers.observe_with_handle(TRIGGER.as_ref(), move |v: &Value| { + // if !v.is_boolean() { + // // Invalid type + // return; + // } + // if !v.as_bool().unwrap() { + // // Counter only on true (= high) + // return; + // } + // match reactive_instance.get(RESULT).and_then(|v| v.as_i64()) { + // Some(current_value) => { + // reactive_instance.set(RESULT, json!(current_value + 1)); + // } + // None => { + // reactive_instance.set(RESULT, json!(0)); + // } + // } + // }); + Ok(()) + } +} + +// impl BehaviourDisconnect for FsNotifyBehaviourTransitions { +// fn disconnect(&self) -> Result<(), BehaviourDisconnectFailed> { +// // TODO: stopper -> stop thread +// OK(()) +// } +// } + +impl BehaviourShutdown for FsNotifyBehaviourTransitions {} + +impl BehaviourTransitions for FsNotifyBehaviourTransitions {} + +// +// use crate::behaviour::component::FsNotifyProperties; +// use reactive_graph_graph::PropertyInstanceSetter; +// use reactive_graph_graph::ReactiveEntityInstance; +// use crate::reactive::entity::Disconnectable; +// use crate::reactive::BehaviourCreationError; +// +// pub const FS_NOTIFY: &str = "fs_notify"; +// +// pub struct FsNotify { +// pub entity: Arc, +// +// stopper_tx: Sender<()>, +// } +// +// impl FsNotify { +// pub fn new(e: Arc, runtime: &Handle) -> Result { +// let filename = e +// .properties +// .get(FsNotifyProperties::FILENAME.as_ref()) +// .ok_or(BehaviourCreationError)? +// .as_string() +// .ok_or(BehaviourCreationError)?; +// let filename = shellexpand::tilde(&filename); +// let path = Path::new(filename.as_ref()).to_owned(); +// let _ = e.properties.get(FsNotifyProperties::TRIGGER.as_ref()).ok_or(BehaviourCreationError)?; +// +// let (stopper_tx, stopper_rx) = unbounded(); +// let (notify_tx, notify_rx) = unbounded(); +// +// let mut watcher: RecommendedWatcher = RecommendedWatcher::new( +// move |result: std::result::Result| { +// let _ = notify_tx.send(result); +// }, +// Config::default(), +// ) +// .map_err(|_| BehaviourCreationError)?; +// watcher.watch(&path, RecursiveMode::NonRecursive).map_err(|_| BehaviourCreationError)?; +// +// let entity = e.clone(); +// runtime.spawn(async move { +// loop { +// if let Ok(Ok(_notify_event)) = notify_rx.try_recv() { +// trace!("{:?} has changed", &path); +// entity.set(FsNotifyProperties::TRIGGER, json!(true)); +// } +// match stopper_rx.try_recv() { +// // Stop thread +// Ok(_) => break, +// Err(_) => std::thread::sleep(Duration::from_millis(1000)), +// } +// } +// if let Err(err) = watcher.unwatch(&path) { +// error!("Failed to unwatch {:?}: {:?}", &path, err); +// } +// }); +// Ok(FsNotify { entity: e, stopper_tx }) +// } +// +// pub fn unwatch(&self) { +// trace!("Stop watching {} with id {}", FS_NOTIFY, self.entity.id); +// let _ = self.stopper_tx.send(()); +// } +// } +// +// impl Disconnectable for FsNotify { +// fn disconnect(&self) { +// self.unwatch(); +// } +// } +// +// impl Drop for FsNotify { +// fn drop(&mut self) { +// self.disconnect(); +// } +// } diff --git a/plugins/file/crates/plugin/src/behaviour/component/mod.rs b/plugins/file/crates/plugin/src/behaviour/component/mod.rs new file mode 100644 index 0000000..76eb5ee --- /dev/null +++ b/plugins/file/crates/plugin/src/behaviour/component/mod.rs @@ -0,0 +1,3 @@ +pub use fs_notify::*; + +pub mod fs_notify; diff --git a/plugins/file/crates/plugin/src/behaviour/mod.rs b/plugins/file/crates/plugin/src/behaviour/mod.rs new file mode 100644 index 0000000..9cea807 --- /dev/null +++ b/plugins/file/crates/plugin/src/behaviour/mod.rs @@ -0,0 +1 @@ +pub mod component; diff --git a/plugins/file/crates/plugin/src/lib.rs b/plugins/file/crates/plugin/src/lib.rs new file mode 100644 index 0000000..372ef53 --- /dev/null +++ b/plugins/file/crates/plugin/src/lib.rs @@ -0,0 +1,3 @@ +pub mod behaviour; +pub mod plugin; +pub mod providers; diff --git a/plugins/file/crates/plugin/src/plugin.rs b/plugins/file/crates/plugin/src/plugin.rs new file mode 100644 index 0000000..3f96179 --- /dev/null +++ b/plugins/file/crates/plugin/src/plugin.rs @@ -0,0 +1,45 @@ +use crate::behaviour::component::FsNotifyFactory; +use reactive_graph_sys_file_model::BEHAVIOUR_FS_NOTIFY; +use reactive_graph_sys_file_model::COMPONENT_BEHAVIOUR_FS_NOTIFY; +use reactive_graph_plugin_api::EntityComponentBehaviourRegistry; +use reactive_graph_plugin_api::prelude::plugin::*; +use reactive_graph_plugin_api::prelude::providers::*; + +export_plugin!({ + "dependencies": [ + { "name": "reactive-graph-plugin-base", "version": ">=0.10.0, <0.11.0" } + { "name": "reactive-graph-plugin-trigger", "version": ">=0.10.0, <0.11.0" } + ] +}); + +#[injectable] +pub trait FilePlugin: Plugin + Send + Sync {} + +#[derive(Component)] +pub struct FilePluginImpl { + component_provider: Arc + Send + Sync>, + + #[component(default = "component_provider_registry")] + component_provider_registry: Arc, + + #[component(default = "entity_component_behaviour_registry")] + entity_component_behaviour_registry: Arc, +} + +#[async_trait] +#[component_alias] +impl Plugin for FilePluginImpl { + async fn activate(&self) -> Result<(), PluginActivationError> { + self.component_provider_registry.register_provider(self.component_provider.clone()).await; + self.entity_component_behaviour_registry + .register(COMPONENT_BEHAVIOUR_FS_NOTIFY.clone(), Arc::new(FsNotifyFactory::new(BEHAVIOUR_FS_NOTIFY.clone()))) + .await; + Ok(()) + } + + async fn deactivate(&self) -> Result<(), PluginDeactivationError> { + self.entity_component_behaviour_registry.unregister(&COMPONENT_BEHAVIOUR_FS_NOTIFY).await; + self.component_provider_registry.unregister_provider(self.component_provider.id()).await; + Ok(()) + } +} diff --git a/plugins/file/crates/plugin/src/providers.rs b/plugins/file/crates/plugin/src/providers.rs new file mode 100644 index 0000000..fda641e --- /dev/null +++ b/plugins/file/crates/plugin/src/providers.rs @@ -0,0 +1,5 @@ +use reactive_graph_plugin_api::prelude::providers::*; + +#[derive(TypeProvider, Component)] +#[type_provider(tys = "Components", path = "types/components")] +pub struct ValueComponentsProvider {} diff --git a/plugins/file/crates/plugin/types/components/file.json b/plugins/file/crates/plugin/types/components/file.json new file mode 100644 index 0000000..466b393 --- /dev/null +++ b/plugins/file/crates/plugin/types/components/file.json @@ -0,0 +1,20 @@ +{ + "namespace": "file", + "type_name": "file", + "description": "Represents a file in the file system", + "properties": [ + { + "name": "filename", + "description": "The filename", + "data_type": "string", + "socket_type": "input" + } + ], + "extensions": [ + { + "namespace": "core", + "type_name": "component_category", + "extension": "file" + } + ] +} diff --git a/plugins/file/crates/plugin/types/components/fs_notify.json b/plugins/file/crates/plugin/types/components/fs_notify.json new file mode 100644 index 0000000..a6829ed --- /dev/null +++ b/plugins/file/crates/plugin/types/components/fs_notify.json @@ -0,0 +1,26 @@ +{ + "namespace": "file", + "type_name": "fs_notify", + "description": "Triggers if the file with the given filename has been changed", + "properties": [ + { + "name": "filename", + "description": "The filename", + "data_type": "string", + "socket_type": "input" + }, + { + "name": "core", + "description": "Triggers if the file with the given filename has been changed", + "data_type": "bool", + "socket_type": "output" + } + ], + "extensions": [ + { + "namespace": "core", + "type_name": "component_category", + "extension": "file" + } + ] +} diff --git a/plugins/file/graphql/create_load_json_with_fs_notify.graphql b/plugins/file/graphql/create_load_json_with_fs_notify.graphql new file mode 100644 index 0000000..8ce03ec --- /dev/null +++ b/plugins/file/graphql/create_load_json_with_fs_notify.graphql @@ -0,0 +1,46 @@ +mutation { + instances { + entities { + create( + type: { + namespace: "file" + name: "load_json" + } + id: "dfc2db31-8dbf-4ab4-9b66-c378fb8a3e41" + components: [ + # This component watches for changes on the file system + # and automatically triggers + { + namespace: "file" + name: "fs_notify" + } + ] + properties: [ + { + name: "filename" + value: "assets/test/hello_world.json" + } + { + name: "trigger" + value: true + } + ] + ) { + id + type { + name + } + properties( + names: [ + "trigger" + "filename" + "result" + ] + ) { + name + value + } + } + } + } +} diff --git a/plugins/file/graphql/get_load_json_with_fs_notify.graphql b/plugins/file/graphql/get_load_json_with_fs_notify.graphql new file mode 100644 index 0000000..a8aaa25 --- /dev/null +++ b/plugins/file/graphql/get_load_json_with_fs_notify.graphql @@ -0,0 +1,23 @@ +# After editing assets/test/hello_world.json execute this query +# Expected: The property result should reflect the changes on the file +query { + instances { + entities(id: "dfc2db31-8dbf-4ab4-9b66-c378fb8a3e41") { + id + type { + namespace + name + } + properties( + names: [ + "trigger" + "filename" + "result" + ] + ) { + name + value + } + } + } +} diff --git a/plugins/system-environment/README.md b/plugins/system-environment/README.md new file mode 100644 index 0000000..8710dc7 --- /dev/null +++ b/plugins/system-environment/README.md @@ -0,0 +1,18 @@ +# Plugin System Environment + +This plugin provides the system environment variables. + +## Entity Types + +| Name | Property | Data Type | Socket Type | +|----------|----------|-----------|-------------| +| EnvVar | name | string | none | +| | value | string | output | + +## Platform Compatibility + +| Platform | Compatibility | +|----------|---------------| +| Linux | ✓ | +| MacOS | ✓ | +| Windows | ✓ | diff --git a/plugins/system-environment/crates/model/Cargo.toml b/plugins/system-environment/crates/model/Cargo.toml new file mode 100644 index 0000000..adc1fad --- /dev/null +++ b/plugins/system-environment/crates/model/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "reactive-graph-sys-system-environment-model" +description = "Reactive Graph - SYS - System Environment - Model" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +readme = "../../../../README.md" + +[dependencies] +serde_json = { workspace = true } +uuid = { workspace = true, features = ["serde", "v4", "v5"] } + +reactive-graph-graph = { workspace = true } +reactive-graph-reactive-model-api = { workspace = true } +reactive-graph-reactive-model-impl = { workspace = true } + +[dev-dependencies] +reactive-graph-graph = { workspace = true, features = ["test"] } + +[lib] +crate-type = ["lib"] diff --git a/plugins/system-environment/crates/model/src/entity/mod.rs b/plugins/system-environment/crates/model/src/entity/mod.rs new file mode 100644 index 0000000..6f706fd --- /dev/null +++ b/plugins/system-environment/crates/model/src/entity/mod.rs @@ -0,0 +1,3 @@ +pub use system_env::*; + +pub mod system_env; diff --git a/plugins/system-environment/crates/model/src/entity/system_env.rs b/plugins/system-environment/crates/model/src/entity/system_env.rs new file mode 100644 index 0000000..f1a4c18 --- /dev/null +++ b/plugins/system-environment/crates/model/src/entity/system_env.rs @@ -0,0 +1,11 @@ +use crate::NAMESPACE_SYSTEM_ENVIRONMENT; +use reactive_graph_graph::entity_ty; +use reactive_graph_reactive_model_api::entity_model; + +entity_ty!(ENTITY_TYPE_SYSTEM_ENV_VAR, NAMESPACE_SYSTEM_ENVIRONMENT, ENTITY_TYPE_NAME_SYSTEM_ENV, "env_var"); + +entity_model!( + EnvVar, + get value string, + get label string +); diff --git a/plugins/system-environment/crates/model/src/lib.rs b/plugins/system-environment/crates/model/src/lib.rs new file mode 100644 index 0000000..7959942 --- /dev/null +++ b/plugins/system-environment/crates/model/src/lib.rs @@ -0,0 +1,9 @@ +use uuid::Uuid; + +pub use entity::*; + +pub mod entity; + +pub const NAMESPACE_SYSTEM_ENVIRONMENT: &str = "system_environment"; + +pub static NAMESPACE_SYSTEM_ENVIRONMENT_ID: Uuid = Uuid::from_u128(0x6ba7b8109dad11d180b400c04fd430c7); diff --git a/plugins/system-environment/crates/plugin/Cargo.toml b/plugins/system-environment/crates/plugin/Cargo.toml new file mode 100644 index 0000000..fb6ec4f --- /dev/null +++ b/plugins/system-environment/crates/plugin/Cargo.toml @@ -0,0 +1,50 @@ +[package] +name = "reactive-graph-sys-system-environment" +description = "Reactive Graph - SYS - System Environment" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +readme = "../../../../README.md" + +[package.metadata.deb] +name = "libreactive-graph-sys-system-environment" +depends = "reactive-graph, libreactive-graph-plugin-base, libreactive-graph-plugin-value" +assets = [ + ["target/release/libreactive_graph_sys_system_environment.so", "usr/share/reactive-graph/default/plugins/installed/libreactive_graph_sys_system_environment.so", "755"], +] + +[dependencies] +async-trait = { workspace = true } +log = { workspace = true, features = ["std", "serde"] } +log4rs = { workspace = true, features = ["console_appender", "file_appender", "toml_format"] } +rust-embed = { workspace = true, features = ["debug-embed", "compression"] } +serde_json = { workspace = true } +springtime-di = { workspace = true, default-features = false, features = ["threadsafe", "derive"] } +thiserror = { workspace = true } +uuid = { workspace = true, features = ["serde", "v4", "v5"] } + +reactive-graph-graph = { workspace = true } +reactive-graph-plugin-api = { workspace = true } +reactive-graph-reactive-model-impl = { workspace = true } +reactive-graph-reactive-service-api = { workspace = true, features = ["derive"] } +reactive-graph-runtime-model = { workspace = true } +reactive-graph-type-system-api = { workspace = true } + +reactive-graph-model-base = { version = "0.10.0", git = "https://github.com/reactive-graph/std.git" } +reactive-graph-model-value = { version = "0.10.0", git = "https://github.com/reactive-graph/std.git" } + +reactive-graph-sys-system-environment-model = { version = "0.10.0", path = "../../crates/model" } + +[lib] +# Plugins use crate-type cdylib +# https://doc.rust-lang.org/reference/linkage.html +# https://users.rust-lang.org/t/what-is-the-difference-between-dylib-and-cdylib/28847/3 +crate-type = ["cdylib"] + +[package.metadata.cargo-post.dependencies] +toml = "0.8" +serde = { version = "1.0", features = ["derive"] } +glob = "0.3" diff --git a/plugins/system-environment/crates/plugin/build.rs b/plugins/system-environment/crates/plugin/build.rs new file mode 100644 index 0000000..8f7525a --- /dev/null +++ b/plugins/system-environment/crates/plugin/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rerun-if-changed=types"); +} diff --git a/plugins/system-environment/crates/plugin/post_build.rs b/plugins/system-environment/crates/plugin/post_build.rs new file mode 100644 index 0000000..e403583 --- /dev/null +++ b/plugins/system-environment/crates/plugin/post_build.rs @@ -0,0 +1,42 @@ +use serde::Deserialize; +use std::env; +use std::fs; +use std::path::PathBuf; + +#[derive(Deserialize)] +struct Deployment { + pub target_dirs: Vec, +} + +fn main() { + match fs::read_to_string("./.deployment.toml") { + Ok(toml_string) => { + let deployment: Result = toml::from_str(&toml_string); + match deployment { + Ok(deployment) => { + let mut crate_out_dir = env::var("CRATE_OUT_DIR").unwrap(); + crate_out_dir.push_str("/libreactive_graph_plugin_system_environment.*"); + for target_dir in deployment.target_dirs { + for entry in glob::glob(crate_out_dir.as_str()).unwrap() { + if let Ok(source_path) = entry { + let file_name = source_path.file_name().unwrap().to_str().unwrap(); + if file_name.ends_with(".so") || file_name.ends_with(".dll") { + let mut target_path = PathBuf::from(&target_dir); + target_path.push(file_name); + println!("Copy plugin from {} to {}", source_path.display(), target_path.display()); + let _ = fs::copy(source_path, target_path); + } + } + } + } + } + Err(e) => { + eprintln!("Failed to parse .deployment.toml: {}", e); + } + } + } + Err(e) => { + eprintln!("Could not read .deployment.toml: {}", e); + } + } +} diff --git a/plugins/system-environment/crates/plugin/src/factory.rs b/plugins/system-environment/crates/plugin/src/factory.rs new file mode 100644 index 0000000..58ecfb4 --- /dev/null +++ b/plugins/system-environment/crates/plugin/src/factory.rs @@ -0,0 +1,84 @@ +use std::env; +use std::ops::Deref; +use std::sync::Arc; +use std::sync::LazyLock; + +use log::info; +use reactive_graph_graph::prelude::*; +use reactive_graph_plugin_api::prelude::plugin::*; +use reactive_graph_reactive_model_impl::ReactiveEntity; +use reactive_graph_reactive_model_impl::ReactiveProperties; +use reactive_graph_reactive_service_api::ReactiveEntityRegistrationError; +use reactive_graph_runtime_model::COMPONENT_LABELED; +use reactive_graph_runtime_model::LabeledProperties::LABEL; +use serde_json::json; +use thiserror::Error; +use uuid::Uuid; + +use reactive_graph_model_base::COMPONENT_NAMED; +use reactive_graph_model_base::NamedProperties::NAME; +use reactive_graph_model_value::COMPONENT_VALUE; +use reactive_graph_model_value::ValueProperties::VALUE; + +use reactive_graph_sys_system_environment_model::ENTITY_TYPE_SYSTEM_ENV_VAR; +use reactive_graph_sys_system_environment_model::NAMESPACE_SYSTEM_ENVIRONMENT_ID; + +static SYSTEM_ENV_COMPONENTS: LazyLock = LazyLock::new(|| { + ComponentTypeIds::new() + .component(COMPONENT_LABELED.clone()) + .component(COMPONENT_VALUE.clone()) + .component(COMPONENT_NAMED.clone()) +}); +#[derive(Component)] +pub struct SystemEnvironmentReactiveEntityFactory { + #[component(default = "crate::plugin::inject_plugin_context")] + context: Arc, +} + +#[derive(Debug, Error)] +pub enum SystemEnvironmentFactoryError { + #[error("Entity type not found")] + EntityTypeNotFound, + #[error("Failed to create reactive entity: {0}")] + ReactiveEntityRegistrationError(#[from] ReactiveEntityRegistrationError), +} + +impl SystemEnvironmentReactiveEntityFactory { + pub async fn create_entity_instances(&self) -> Result<(), SystemEnvironmentFactoryError> { + let entity_type_manager = self.context.get_entity_type_manager(); + let ty = ENTITY_TYPE_SYSTEM_ENV_VAR.deref(); + // let ty = EntityTypeId::new_from_type("asdf", "asdf"); + info!("{ty}"); + let Some(entity_type) = entity_type_manager.get(ty) else { + return Err(SystemEnvironmentFactoryError::EntityTypeNotFound); + }; + let entity_instance_manager = self.context.get_entity_instance_manager(); + // let components = ComponentTypeIds::new() + // .component(&COMPONENT_LABELED) + // .component(&COMPONENT_VALUE) + // .component(&COMPONENT_NAMED); + let properties = PropertyInstances::new_from_property_types_with_defaults(&entity_type.properties); + for (name, value) in env::vars() { + let id = Uuid::new_v5(&NAMESPACE_SYSTEM_ENVIRONMENT_ID, name.as_bytes()); + if entity_instance_manager.has(id) { + continue; + } + let mut properties = properties.clone(); + properties.set(LABEL, json!(format!("/io/reactive-graph/system/env/{}", name.clone().to_lowercase()))); + properties.set(VALUE, json!(value)); + properties.set(NAME, json!(name.clone())); + let properties = ReactiveProperties::new_with_id_from_properties(id, properties); + let reactive_entity = ReactiveEntity::builder() + // let entity_instance = EntityInstance::builder() + .ty(&entity_type.ty) + .id(id) + .components(SYSTEM_ENV_COMPONENTS.clone()) + .properties(properties) + .build(); + if let Err(e) = entity_instance_manager.register(reactive_entity) { + return Err(e.into()); + } + } + Ok(()) + } +} diff --git a/plugins/system-environment/crates/plugin/src/lib.rs b/plugins/system-environment/crates/plugin/src/lib.rs new file mode 100644 index 0000000..a4be32c --- /dev/null +++ b/plugins/system-environment/crates/plugin/src/lib.rs @@ -0,0 +1,5 @@ +#![allow(clippy::map_entry)] + +pub mod factory; +pub mod plugin; +pub mod providers; diff --git a/plugins/system-environment/crates/plugin/src/plugin.rs b/plugins/system-environment/crates/plugin/src/plugin.rs new file mode 100644 index 0000000..1cdbbf3 --- /dev/null +++ b/plugins/system-environment/crates/plugin/src/plugin.rs @@ -0,0 +1,39 @@ +use crate::factory::SystemEnvironmentReactiveEntityFactory; +use reactive_graph_plugin_api::prelude::plugin::*; +use reactive_graph_plugin_api::prelude::providers::*; + +export_plugin!({ + "dependencies": [ + { "name": "reactive-graph-plugin-base", "version": ">=0.10.0, <0.11.0" }, + { "name": "reactive-graph-plugin-value", "version": ">=0.10.0, <0.11.0" } + ] +}); + +#[derive(Component)] +pub struct SystemEnvironmentPlugin { + entity_types_provider: Arc + Send + Sync>, + + factory: Arc, + + #[component(default = "entity_types_provider_registry")] + entity_type_provider_registry: Arc, +} + +#[async_trait] +#[component_alias] +impl Plugin for SystemEnvironmentPlugin { + async fn activate(&self) -> Result<(), PluginActivationError> { + self.entity_type_provider_registry.register_provider(self.entity_types_provider.clone()).await; + if let Err(e) = self.factory.create_entity_instances().await { + return Err(PluginActivationError::ActivationFailed(format!( + "Failed to create entities which represents the system environment variables: {e}" + ))); + } + Ok(()) + } + + async fn deactivate(&self) -> Result<(), PluginDeactivationError> { + self.entity_type_provider_registry.unregister_provider(self.entity_types_provider.id()).await; + Ok(()) + } +} diff --git a/plugins/system-environment/crates/plugin/src/providers.rs b/plugins/system-environment/crates/plugin/src/providers.rs new file mode 100644 index 0000000..1d4a2a0 --- /dev/null +++ b/plugins/system-environment/crates/plugin/src/providers.rs @@ -0,0 +1,5 @@ +use reactive_graph_plugin_api::prelude::providers::*; + +#[derive(TypeProvider, Component)] +#[type_provider(tys = "EntityTypes", path = "types/entities")] +pub struct SystemEnvironmentEntityTypesProvider {} diff --git a/plugins/system-environment/crates/plugin/src/tests/mod.rs b/plugins/system-environment/crates/plugin/src/tests/mod.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/plugins/system-environment/crates/plugin/src/tests/mod.rs @@ -0,0 +1 @@ + diff --git a/plugins/system-environment/crates/plugin/types/entities/system_env.json b/plugins/system-environment/crates/plugin/types/entities/system_env.json new file mode 100644 index 0000000..56ef826 --- /dev/null +++ b/plugins/system-environment/crates/plugin/types/entities/system_env.json @@ -0,0 +1,114 @@ +{ + "namespace": "system_environment", + "type_name": "env_var", + "description": "System Environment Variable", + "components": [ + { + "namespace": "core", + "type_name": "labeled" + }, + { + "namespace": "base", + "type_name": "named" + }, + { + "namespace": "value", + "type_name": "value_string" + } + ], + "properties": [ + { + "name": "value", + "data_type": "string", + "socket_type": "output", + "mutability": "immutable" + } + ], + "extensions": [ + { + "namespace": "flow_editor", + "type_name": "palette", + "extension": { + "content": "System Env", + "styles": { + "font-size": "12px", + "font-family": "Fira Code", + "padding": "5px" + } + } + }, + { + "namespace": "flow_editor", + "type_name": "shape", + "extension": { + "width": 200, + "socket": { + "width": 60, + "height": 30, + "offset": 5 + }, + "offset": { + "top": "socket.height", + "bottom": "socket.height" + }, + "elements": { + "title": { + "show": true, + "type": "text", + "content": "element.description", + "position": { + "left": 0, + "top": 0, + "width": "shape.width", + "height": "socket.height" + }, + "styles": { + "font-size": "12px", + "fill": "black" + } + }, + "symbol": { + "show": true, + "type": "text", + "content": "System Env", + "position": { + "left": 0, + "top": 0, + "width": "shape.width", + "height": "shape.height" + }, + "styles": { + "font-family": "Fira Code", + "font-size": "40px", + "fill": "fuchsia" + } + }, + "id": { + "show": true, + "type": "text", + "content": "shape.id", + "position": { + "left": 0, + "top": "shape.height-socket.height", + "width": "shape.width", + "height": "socket.height" + }, + "styles": { + "font-size": "9px", + "fill": "black" + } + } + } + } + }, + { + "namespace": "metadata", + "type_name": "dublin-core", + "extension":{ + "title": "System Env", + "subject": "System Environment Variables", + "creator": "Hanack" + } + } + ] +} diff --git a/plugins/system-environment/graphql/find_system_env_cargo.graphql b/plugins/system-environment/graphql/find_system_env_cargo.graphql new file mode 100644 index 0000000..1c62116 --- /dev/null +++ b/plugins/system-environment/graphql/find_system_env_cargo.graphql @@ -0,0 +1,20 @@ +query findSystemEnvCargo { + instances { + entities(label: "/io/reactive-graph/system/env/cargo") { + id + label + type { + namespace + name + } + properties(names: [ + "label" + "name" + "value" + ]) { + name + value + } + } + } +} diff --git a/plugins/system-environment/graphql/find_system_env_desktop_session.graphql b/plugins/system-environment/graphql/find_system_env_desktop_session.graphql new file mode 100644 index 0000000..65b5538 --- /dev/null +++ b/plugins/system-environment/graphql/find_system_env_desktop_session.graphql @@ -0,0 +1,20 @@ +query findSystemEnvDesktopSession { + instances { + entities(label: "/io/reactive-graph/system/env/desktop_session") { + id + label + type { + namespace + name + } + properties(names: [ + "label" + "name" + "value" + ]) { + name + value + } + } + } +} diff --git a/plugins/system-environment/graphql/find_system_env_display.graphql b/plugins/system-environment/graphql/find_system_env_display.graphql new file mode 100644 index 0000000..335f23a --- /dev/null +++ b/plugins/system-environment/graphql/find_system_env_display.graphql @@ -0,0 +1,20 @@ +query findSystemEnvDisplay { + instances { + entities(label: "/io/reactive-graph/system/env/display") { + id + label + type { + namespace + name + } + properties(names: [ + "label" + "name" + "value" + ]) { + name + value + } + } + } +} diff --git a/plugins/system-environment/graphql/find_system_env_home.graphql b/plugins/system-environment/graphql/find_system_env_home.graphql new file mode 100644 index 0000000..598db63 --- /dev/null +++ b/plugins/system-environment/graphql/find_system_env_home.graphql @@ -0,0 +1,19 @@ +query findSystemEnvHome { + instances { + entities(label: "/io/reactive-graph/system/env/home") { + id + label + type { + namespace + name + } + properties(names: [ + "name" + "value" + ]) { + name + value + } + } + } +} diff --git a/plugins/system-environment/graphql/find_system_env_lang.graphql b/plugins/system-environment/graphql/find_system_env_lang.graphql new file mode 100644 index 0000000..269bd36 --- /dev/null +++ b/plugins/system-environment/graphql/find_system_env_lang.graphql @@ -0,0 +1,20 @@ +query findSystemEnvLang { + instances { + entities(label: "/io/reactive-graph/system/env/lang") { + id + label + type { + namespace + name + } + properties(names: [ + "label" + "name" + "value" + ]) { + name + value + } + } + } +} diff --git a/plugins/system-environment/graphql/find_system_env_path.graphql b/plugins/system-environment/graphql/find_system_env_path.graphql new file mode 100644 index 0000000..a010a16 --- /dev/null +++ b/plugins/system-environment/graphql/find_system_env_path.graphql @@ -0,0 +1,20 @@ +query findSystemEnvPath { + instances { + entities(label: "/io/reactive-graph/system/env/path") { + id + label + type { + namespace + name + } + properties(names: [ + "label" + "name" + "value" + ]) { + name + value + } + } + } +} diff --git a/plugins/system-environment/graphql/find_system_env_pwd.graphql b/plugins/system-environment/graphql/find_system_env_pwd.graphql new file mode 100644 index 0000000..e083d65 --- /dev/null +++ b/plugins/system-environment/graphql/find_system_env_pwd.graphql @@ -0,0 +1,20 @@ +query findSystemEnvPwd { + instances { + entities(label: "/io/reactive-graph/system/env/pwd") { + id + label + type { + namespace + name + } + properties(names: [ + "label" + "name" + "value" + ]) { + name + value + } + } + } +} diff --git a/plugins/system-environment/graphql/find_system_env_username.graphql b/plugins/system-environment/graphql/find_system_env_username.graphql new file mode 100644 index 0000000..75c31f0 --- /dev/null +++ b/plugins/system-environment/graphql/find_system_env_username.graphql @@ -0,0 +1,20 @@ +query findSystemEnvUsername { + instances { + entities(label: "/io/reactive-graph/system/env/username") { + id + label + type { + namespace + name + } + properties(names: [ + "label" + "name" + "value" + ]) { + name + value + } + } + } +} diff --git a/plugins/system-environment/graphql/find_system_env_xdg_current_desktop.graphql b/plugins/system-environment/graphql/find_system_env_xdg_current_desktop.graphql new file mode 100644 index 0000000..582b8e8 --- /dev/null +++ b/plugins/system-environment/graphql/find_system_env_xdg_current_desktop.graphql @@ -0,0 +1,20 @@ +query findSystemEnvXdgCurrentDesktop { + instances { + entities(label: "/io/reactive-graph/system/env/xdg_current_desktop") { + id + label + type { + namespace + name + } + properties(names: [ + "label" + "name" + "value" + ]) { + name + value + } + } + } +} diff --git a/plugins/system-environment/graphql/find_system_env_xdg_data_dirs.graphql b/plugins/system-environment/graphql/find_system_env_xdg_data_dirs.graphql new file mode 100644 index 0000000..3a80fb3 --- /dev/null +++ b/plugins/system-environment/graphql/find_system_env_xdg_data_dirs.graphql @@ -0,0 +1,20 @@ +query findSystemEnvXdgDataDirs { + instances { + entities(label: "/io/reactive-graph/system/env/xdg_data_dirs") { + id + label + type { + namespace + name + } + properties(names: [ + "label" + "name" + "value" + ]) { + name + value + } + } + } +} diff --git a/plugins/system-environment/graphql/get_system_environment_variables.graphql b/plugins/system-environment/graphql/get_system_environment_variables.graphql new file mode 100644 index 0000000..3022074 --- /dev/null +++ b/plugins/system-environment/graphql/get_system_environment_variables.graphql @@ -0,0 +1,21 @@ +query getSystemEnvironmentVariables { + instances { + entities( + type: { + namespace: "system" + name: "system_env" + } + ) { + id + label + type { + namespace + name + } + properties(names: ["name", "value"]) { + name + value + } + } + } +} From 3b0160445b9a366ea0878690056c92d45967f36c Mon Sep 17 00:00:00 2001 From: Andreas Schaeffer Date: Sat, 26 Apr 2025 03:18:57 +0200 Subject: [PATCH 2/6] SF --- plugins/binary/crates/model/src/entity/load_binary_data.rs | 2 +- plugins/binary/crates/model/src/entity/save_binary_data.rs | 2 +- .../file/crates/plugin/src/behaviour/component/fs_notify.rs | 2 +- plugins/file/crates/plugin/src/plugin.rs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/binary/crates/model/src/entity/load_binary_data.rs b/plugins/binary/crates/model/src/entity/load_binary_data.rs index fd7ed7e..875d063 100644 --- a/plugins/binary/crates/model/src/entity/load_binary_data.rs +++ b/plugins/binary/crates/model/src/entity/load_binary_data.rs @@ -3,9 +3,9 @@ use crate::BinaryDataUrl; use crate::NAMESPACE_BINARY; use reactive_graph_graph::entity_ty; use reactive_graph_model_base::Named; -use reactive_graph_sys_file_model::File; use reactive_graph_reactive_model_api::entity_model; use reactive_graph_runtime_model::Action; +use reactive_graph_sys_file_model::File; // All properties are defined in the component(s) diff --git a/plugins/binary/crates/model/src/entity/save_binary_data.rs b/plugins/binary/crates/model/src/entity/save_binary_data.rs index f4b359d..478898e 100644 --- a/plugins/binary/crates/model/src/entity/save_binary_data.rs +++ b/plugins/binary/crates/model/src/entity/save_binary_data.rs @@ -3,9 +3,9 @@ use crate::BinaryDataUrl; use crate::NAMESPACE_BINARY; use reactive_graph_graph::entity_ty; use reactive_graph_model_base::Named; -use reactive_graph_sys_file_model::File; use reactive_graph_reactive_model_api::entity_model; use reactive_graph_runtime_model::Action; +use reactive_graph_sys_file_model::File; // All properties are defined in the component(s) diff --git a/plugins/file/crates/plugin/src/behaviour/component/fs_notify.rs b/plugins/file/crates/plugin/src/behaviour/component/fs_notify.rs index 1e4d71e..a671c94 100644 --- a/plugins/file/crates/plugin/src/behaviour/component/fs_notify.rs +++ b/plugins/file/crates/plugin/src/behaviour/component/fs_notify.rs @@ -7,8 +7,8 @@ use reactive_graph_reactive_model_impl::ReactiveEntity; use serde_json::json; use uuid::Uuid; -use reactive_graph_sys_file_model::FileProperties::FILENAME; use reactive_graph_runtime_model::ActionProperties::TRIGGER; +use reactive_graph_sys_file_model::FileProperties::FILENAME; use std::path::Path; use std::time::Duration; diff --git a/plugins/file/crates/plugin/src/plugin.rs b/plugins/file/crates/plugin/src/plugin.rs index 3f96179..de971f9 100644 --- a/plugins/file/crates/plugin/src/plugin.rs +++ b/plugins/file/crates/plugin/src/plugin.rs @@ -1,9 +1,9 @@ use crate::behaviour::component::FsNotifyFactory; -use reactive_graph_sys_file_model::BEHAVIOUR_FS_NOTIFY; -use reactive_graph_sys_file_model::COMPONENT_BEHAVIOUR_FS_NOTIFY; use reactive_graph_plugin_api::EntityComponentBehaviourRegistry; use reactive_graph_plugin_api::prelude::plugin::*; use reactive_graph_plugin_api::prelude::providers::*; +use reactive_graph_sys_file_model::BEHAVIOUR_FS_NOTIFY; +use reactive_graph_sys_file_model::COMPONENT_BEHAVIOUR_FS_NOTIFY; export_plugin!({ "dependencies": [ From 3c17bb680f2864f6a24a9d425f16a381045c145e Mon Sep 17 00:00:00 2001 From: Andreas Schaeffer Date: Sat, 26 Apr 2025 03:25:39 +0200 Subject: [PATCH 3/6] Remove unnecessary nodejs & yarn setup --- .github/workflows/docs.yml | 12 ------------ .github/workflows/release.yml | 36 ----------------------------------- .github/workflows/rust.yml | 36 ----------------------------------- 3 files changed, 84 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 4cc5a82..7891ea8 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -34,18 +34,6 @@ jobs: with: toolchain: nightly-2025-03-14 components: rustfmt, rust-src - - name: Setup Node.js 18 - uses: actions/setup-node@v4 - with: - node-version: 18 - - name: Install Yarn - uses: borales/actions-yarn@v5 - with: - cmd: --cwd plugins/graphql-client/web install - - name: Install Yarn - uses: borales/actions-yarn@v5 - with: - cmd: --cwd plugins/graphql-schema-visualization/web install - name: Cache dependencies uses: Swatinem/rust-cache@v2 - name: Run sccache-cache diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6545013..ba6b57e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -62,18 +62,6 @@ jobs: # packages: pkg-config openssl libssl-dev # version: 1.1 # if: matrix.os == 'ubuntu-22.04' - # - name: Setup Node.js 18 - # uses: actions/setup-node@v4 - # with: - # node-version: 18 - # - name: Install Yarn - # uses: borales/actions-yarn@v5 - # with: - # cmd: --cwd plugins/graphql-client/web install - # - name: Install Yarn - # uses: borales/actions-yarn@v5 - # with: - # cmd: --cwd plugins/graphql-schema-visualization/web install # - name: Upload Rust Binary # uses: taiki-e/upload-rust-binary-action@v1 # with: @@ -98,18 +86,6 @@ jobs: # profile: minimal # toolchain: nightly # override: true - # - name: Setup Node.js 18 - # uses: actions/setup-node@v4 - # with: - # node-version: 18 - # - name: Install Yarn - # uses: borales/actions-yarn@v5 - # with: - # cmd: --cwd plugins/graphql-client/web install - # - name: Install Yarn - # uses: borales/actions-yarn@v5 - # with: - # cmd: --cwd plugins/graphql-schema-visualization/web install # - name: Install Cargo Workspaces # uses: actions-rs/install@v0.1 # with: @@ -175,18 +151,6 @@ jobs: uses: taiki-e/setup-cross-toolchain-action@v1 with: target: ${{ matrix.target }} - - name: Setup Node.js 18 - uses: actions/setup-node@v4 - with: - node-version: 18 - - name: Install Yarn - uses: borales/actions-yarn@v5 - with: - cmd: --cwd plugins/graphql-client/web install - - name: Install Yarn - uses: borales/actions-yarn@v5 - with: - cmd: --cwd plugins/graphql-schema-visualization/web install - name: Create Debian Package run: | # It's important to change into the plugin directory and building each package diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 11319ce..5d92c89 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -71,18 +71,6 @@ jobs: toolchain: ${{ matrix.toolchain }} target: ${{ matrix.target }} components: clippy - - name: Setup Node.js 18 - uses: actions/setup-node@v4 - with: - node-version: 18 - - name: Install Yarn - uses: borales/actions-yarn@v5 - with: - cmd: --cwd plugins/graphql-client/web install - - name: Install Yarn - uses: borales/actions-yarn@v5 - with: - cmd: --cwd plugins/graphql-schema-visualization/web install - name: Cache dependencies uses: Swatinem/rust-cache@v2 - name: Run sccache-cache @@ -105,18 +93,6 @@ jobs: uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.toolchain }} - - name: Setup Node.js 18 - uses: actions/setup-node@v4 - with: - node-version: 18 - - name: Install Yarn - uses: borales/actions-yarn@v5 - with: - cmd: --cwd plugins/graphql-client/web install - - name: Install Yarn - uses: borales/actions-yarn@v5 - with: - cmd: --cwd plugins/graphql-schema-visualization/web install - name: Cache dependencies uses: Swatinem/rust-cache@v2 - name: Run sccache-cache @@ -146,18 +122,6 @@ jobs: packages: musl-tools # provides musl-gcc version: 1.0 if: matrix.target == 'x86_64-unknown-linux-musl' - - name: Setup Node.js 18 - uses: actions/setup-node@v4 - with: - node-version: 18 - - name: Install Yarn - uses: borales/actions-yarn@v5 - with: - cmd: --cwd plugins/graphql-client/web install - - name: Install Yarn - uses: borales/actions-yarn@v5 - with: - cmd: --cwd plugins/graphql-schema-visualization/web install - name: Cache dependencies uses: Swatinem/rust-cache@v2 - name: Run sccache-cache From b3a2f977a8496e21790f007c567e5284a79eae5f Mon Sep 17 00:00:00 2001 From: Andreas Schaeffer Date: Sat, 26 Apr 2025 03:26:55 +0200 Subject: [PATCH 4/6] Remove all deb packages not contained in this repository and fix renamed deb package names --- .github/workflows/release.yml | 50 +------------------------ plugins/binary/crates/plugin/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 50 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ba6b57e..d63d980 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -154,66 +154,18 @@ jobs: - name: Create Debian Package run: | # It's important to change into the plugin directory and building each package - cd ./plugins/arithmetic/crates/plugin - cargo deb -p reactive-graph-plugin-arithmetic --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../base/crates/plugin - cargo deb -p reactive-graph-plugin-base --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} cd ../../../binary/crates/plugin cargo deb -p reactive-graph-plugin-binary --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../color/crates/plugin - cargo deb -p reactive-graph-plugin-color --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../comparison/crates/plugin - cargo deb -p reactive-graph-plugin-comparison --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../config/crates/plugin - cargo deb -p reactive-graph-plugin-config --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../connector/crates/plugin - cargo deb -p reactive-graph-plugin-connector --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../date-time/crates/plugin - cargo deb -p reactive-graph-plugin-date-time --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} cd ../../../file/crates/plugin cargo deb -p reactive-graph-plugin-file --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../flow/crates/plugin - cargo deb -p reactive-graph-plugin-flow --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../git/crates/plugin - cargo deb -p reactive-graph-plugin-git --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../http/crates/plugin - cargo deb -p reactive-graph-plugin-http --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - # cd ../../../i18n/crates/plugin - # cargo deb -p reactive-graph-plugin-i18n --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../json/crates/plugin - cargo deb -p reactive-graph-plugin-json --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../logical/crates/plugin - cargo deb -p reactive-graph-plugin-logical --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../metadata/crates/plugin - cargo deb -p reactive-graph-plugin-metadata --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../numeric/crates/plugin - cargo deb -p reactive-graph-plugin-numeric --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../random/crates/plugin - cargo deb -p reactive-graph-plugin-random --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../result/crates/plugin - cargo deb -p reactive-graph-plugin-result --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../state/crates/plugin - cargo deb -p reactive-graph-plugin-state --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../string/crates/plugin - cargo deb -p reactive-graph-plugin-string --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} cd ../../../system-environment/crates/plugin cargo deb -p reactive-graph-plugin-system-environment --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../taxonomy/crates/plugin - cargo deb -p reactive-graph-plugin-taxonomy --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../trigger/crates/plugin - cargo deb -p reactive-graph-plugin-trigger --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../value/crates/plugin - cargo deb -p reactive-graph-plugin-value --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../../../graphql-client - cargo deb -p reactive-graph-plugin-graphql-client --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} - cd ../graphql-schema-visualization - cargo deb -p reactive-graph-plugin-graphql-schema-visualization --target=${{ matrix.target }} --deb-version ${{steps.tag.outputs.tag}} env: VERGEN_IDEMPOTENT: true - name: Upload debian package to release uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: target/${{ matrix.target }}/debian/libreactive-graph-plugin-*_*_*.deb + file: target/${{ matrix.target }}/debian/libreactive-graph-sys-*_*_*.deb file_glob: true tag: ${{ github.ref }} diff --git a/plugins/binary/crates/plugin/Cargo.toml b/plugins/binary/crates/plugin/Cargo.toml index 482bb7f..002ddd6 100644 --- a/plugins/binary/crates/plugin/Cargo.toml +++ b/plugins/binary/crates/plugin/Cargo.toml @@ -11,7 +11,7 @@ readme = "../../../../README.md" [package.metadata.deb] name = "libreactive-graph-sys-binary" -depends = "reactive-graph, libreactive-graph-plugin-base, libreactive-graph-plugin-file, libreactive-graph-plugin-trigger" +depends = "reactive-graph, libreactive-graph-plugin-base, libreactive-graph-plugin-trigger, libreactive-graph-sys-file" assets = [ ["target/release/libreactive_graph_sys_binary.so", "usr/share/reactive-graph/default/plugins/installed/libreactive_graph_sys_binary.so", "755"], ] From c492b7b78c2119c28f50603952fbc93d01b3731f Mon Sep 17 00:00:00 2001 From: Andreas Schaeffer Date: Sat, 26 Apr 2025 03:34:34 +0200 Subject: [PATCH 5/6] Added book --- .gitignore | 2 + book/book.css | 100 +++ book/book.toml | 69 +++ book/graphql-playground-react-middleware.js | 132 ++++ book/graphql-playground.css | 106 ++++ book/graphql-playground.js | 131 ++++ book/mdbook-admonish.css | 348 +++++++++++ book/mermaid-init.js | 4 + book/mermaid.min.js | 3 + book/src/Introduction.md | 5 + book/src/SUMMARY.md | 3 + book/theme/css/chrome.css | 650 ++++++++++++++++++++ book/theme/css/general.css | 278 +++++++++ book/theme/css/variables.css | 280 +++++++++ book/theme/favicon.png | Bin 0 -> 1790 bytes book/theme/favicon.svg | 20 + book/theme/index.hbs | 395 ++++++++++++ 17 files changed, 2526 insertions(+) create mode 100644 book/book.css create mode 100644 book/book.toml create mode 100644 book/graphql-playground-react-middleware.js create mode 100644 book/graphql-playground.css create mode 100644 book/graphql-playground.js create mode 100644 book/mdbook-admonish.css create mode 100644 book/mermaid-init.js create mode 100644 book/mermaid.min.js create mode 100644 book/src/Introduction.md create mode 100644 book/src/SUMMARY.md create mode 100644 book/theme/css/chrome.css create mode 100644 book/theme/css/general.css create mode 100644 book/theme/css/variables.css create mode 100644 book/theme/favicon.png create mode 100644 book/theme/favicon.svg create mode 100644 book/theme/index.hbs diff --git a/.gitignore b/.gitignore index 54fc50c..ebe68c5 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ tarpaulin-report.html # Exclude generated frontend bundles plugins/**/web/dist/bundle + +book/book diff --git a/book/book.css b/book/book.css new file mode 100644 index 0000000..a3b6ede --- /dev/null +++ b/book/book.css @@ -0,0 +1,100 @@ +h1 { + color: var(--brand); +} + +h2, h3 { + font-family: var(--font-sans-light); + margin-block-start: var(--size-1); + margin-block-end: var(--size-3); +} + +h4, h5, h6 { + font-family: var(--font-sans-light); + margin-block-start: var(--size-1); + margin-block-end: var(--size-2); +} + +ul { + margin-block-start: var(--size-1); + margin-block-end: var(--size-3); +} + +p { + font-family: var(--font-sans); + margin-block-end: var(--size-3); +} + +details { + margin-block-start: var(--size-1); + margin-block-end: var(--size-3); +} + +code { + margin-block-end: var(--size-3); +} + +main img { + margin-block-start: var(--size-1); + margin-block-end: var(--size-3); +} + +.rg-ti { + font-family: "tabler-icons" !important; +} + +.container { + width: min(100% - 2rem, 50rem); + margin-inline: auto; +} + +.sidebar-logo { + width: 100%; + vertical-align: middle; +} + +.rg-alert-body { + margin-top: var(--size-3); + font-size: var(--font-size-5); + line-height: var(--font-lineheight-4); + font-weight: var(--font-weight-6); +} + +.rg-icon-grid { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + justify-content: space-around; + gap: var(--size-1); + padding: var(--size-1); + align-items: center; +} + +.rg-icon-grid-1 { + display: grid; + grid-template-columns: 1fr 8fr 1fr; + align-items: center; + justify-content: space-around; + gap: var(--size-1); + padding: var(--size-1); + height: 100%; +} + +.rg-icon-grid img { + width: 100%; + height: var(--size-8); +} + +img.rg-icon-logo { + width: 100%; + vertical-align: middle; +} + +#search-wrapper { + margin-top: var(--size-8); + margin-bottom: var(--size-8); +} + +@media (prefers-color-scheme: dark) { + .rg-header-icons { + filter: invert(1); + } +} diff --git a/book/book.toml b/book/book.toml new file mode 100644 index 0000000..2aaacee --- /dev/null +++ b/book/book.toml @@ -0,0 +1,69 @@ +[book] +authors = [ + "Andreas Schaeffer" +] +language = "en" +multilingual = false +src = "src" +title = "Reactive Graph - System Library" +description = "The system library of Reactive Graph" + +[preprocessor.mermaid] +command = "mdbook-mermaid" + +[preprocessor.admonish] +command = "mdbook-admonish" +assets_version = "3.0.2" # do not edit: managed by `mdbook-admonish install` + +[preprocessor.graphql-playground] +command = "mdbook-graphql-playground" +renderer = ["html"] + +[output] + +[output.html] +additional-js = [ + "mermaid.min.js", + "mermaid-init.js", + "graphql-playground-react-middleware.js", + "graphql-playground.js" +] +additional-css = [ +# "./src/design/public/css/open-props.min.css", +# "./src/design/public/css/open-props-buttons.min.css", +# "./src/design/public/css/open-props-normalize.min.css", +# "./src/design/public/fonts/fonts.css", +# "./src/design/public/css/variables/palette.css", +# "./src/design/public/css/variables/gradients.css", +# "./src/design/public/css/variables/surface.css", +# "./src/design/public/css/variables/patterns.css", +# "./src/design/public/css/variables/text.css", +# "./src/design/public/css/variables/brand.css", +# "./src/design/public/css/atoms/blockquote.css", +# "./src/design/public/css/atoms/hr.css", +# "./src/design/public/css/atoms/lists.css", +# "./src/design/public/css/atoms/subtitle.css", +# "./src/design/public/css/atoms/surface.css", +# "./src/design/public/css/atoms/tag.css", +# "./src/design/public/css/atoms/title.css", +# "./src/design/public/css/atoms/token.css", +# "./src/design/public/css/molecules/alert.css", +# "./src/design/public/css/molecules/article.css", +# "./src/design/public/css/molecules/card.css", +# "./src/design/public/css/molecules/emphasis-box.css", +# "./src/design/public/css/molecules/intro.css", +# "./src/design/public/css/molecules/list-box.css", +# "./src/design/public/css/molecules/logo.css", +# "./src/design/public/css/molecules/zebra-box.css", +# "./src/design/public/css/organisms/organisms.css", + "././book.css", + "././mdbook-admonish.css", + "././graphql-playground.css", +] +theme = "theme" +default-theme = "theme" +preferred-dark-theme = "theme" +git-repository-url = "https://github.com/reactive-graph/std" +edit-url-template = "https://github.com/reactive-graph/std/edit/main/{path}" +site-url = "https://std.reactive-graph.io/" +cname = "std.reactive-graph.io" diff --git a/book/graphql-playground-react-middleware.js b/book/graphql-playground-react-middleware.js new file mode 100644 index 0000000..a0d7b8a --- /dev/null +++ b/book/graphql-playground-react-middleware.js @@ -0,0 +1,132 @@ +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=535)}([function(e,t,n){"use strict";n.d(t,"S",(function(){return C})),n.d(t,"x",(function(){return w})),n.d(t,"R",(function(){return S})),n.d(t,"w",(function(){return _})),n.d(t,"N",(function(){return k})),n.d(t,"u",(function(){return A})),n.d(t,"H",(function(){return T})),n.d(t,"o",(function(){return O})),n.d(t,"T",(function(){return F})),n.d(t,"y",(function(){return N})),n.d(t,"E",(function(){return I})),n.d(t,"l",(function(){return M})),n.d(t,"F",(function(){return j})),n.d(t,"m",(function(){return L})),n.d(t,"J",(function(){return P})),n.d(t,"q",(function(){return R})),n.d(t,"L",(function(){return B})),n.d(t,"s",(function(){return U})),n.d(t,"G",(function(){return z})),n.d(t,"n",(function(){return V})),n.d(t,"O",(function(){return q})),n.d(t,"v",(function(){return H})),n.d(t,"I",(function(){return W})),n.d(t,"p",(function(){return G})),n.d(t,"D",(function(){return K})),n.d(t,"k",(function(){return J})),n.d(t,"C",(function(){return Q})),n.d(t,"j",(function(){return Y})),n.d(t,"d",(function(){return $})),n.d(t,"e",(function(){return X})),n.d(t,"U",(function(){return Z})),n.d(t,"z",(function(){return ee})),n.d(t,"M",(function(){return te})),n.d(t,"t",(function(){return ne})),n.d(t,"B",(function(){return re})),n.d(t,"K",(function(){return ie})),n.d(t,"r",(function(){return oe})),n.d(t,"A",(function(){return ae})),n.d(t,"g",(function(){return ce})),n.d(t,"f",(function(){return le})),n.d(t,"i",(function(){return me})),n.d(t,"P",(function(){return ge})),n.d(t,"c",(function(){return ye})),n.d(t,"h",(function(){return ve})),n.d(t,"a",(function(){return Ee})),n.d(t,"b",(function(){return De})),n.d(t,"Q",(function(){return we}));var r=n(54),i=n(25),o=n(4),a=n(36),s=n(56),u=n(40),c=n(8),l=n(49),p=n(47),f=n(38),d=n(31);function h(e){return e}var m=n(46),g=n(43),y=n(2),v=n(1),b=n(15),E=n(210);function x(e,t){for(var n=0;n0?e:void 0}$.prototype.toString=function(){return"["+String(this.ofType)+"]"},$.prototype.toJSON=function(){return this.toString()},Object.defineProperty($.prototype,i.c,{get:function(){return"GraphQLList"}}),Object(m.a)($),X.prototype.toString=function(){return String(this.ofType)+"!"},X.prototype.toJSON=function(){return this.toString()},Object.defineProperty(X.prototype,i.c,{get:function(){return"GraphQLNonNull"}}),Object(m.a)(X);var ce=function(){function e(e){var t,n,r,i=null!==(t=e.parseValue)&&void 0!==t?t:h;this.name=e.name,this.description=e.description,this.specifiedByUrl=e.specifiedByUrl,this.serialize=null!==(n=e.serialize)&&void 0!==n?n:h,this.parseValue=i,this.parseLiteral=null!==(r=e.parseLiteral)&&void 0!==r?r:function(e){return i(Object(E.a)(e))},this.extensions=e.extensions&&Object(u.a)(e.extensions),this.astNode=e.astNode,this.extensionASTNodes=ue(e.extensionASTNodes),"string"==typeof e.name||Object(c.a)(0,"Must provide name."),null==e.specifiedByUrl||"string"==typeof e.specifiedByUrl||Object(c.a)(0,"".concat(this.name,' must provide "specifiedByUrl" as a string, ')+"but got: ".concat(Object(o.a)(e.specifiedByUrl),".")),null==e.serialize||"function"==typeof e.serialize||Object(c.a)(0,"".concat(this.name,' must provide "serialize" function. If this custom Scalar is also used as an input type, ensure "parseValue" and "parseLiteral" functions are also provided.')),e.parseLiteral&&("function"==typeof e.parseValue&&"function"==typeof e.parseLiteral||Object(c.a)(0,"".concat(this.name,' must provide both "parseValue" and "parseLiteral" functions.')))}var t=e.prototype;return t.toConfig=function(){var e;return{name:this.name,description:this.description,specifiedByUrl:this.specifiedByUrl,serialize:this.serialize,parseValue:this.parseValue,parseLiteral:this.parseLiteral,extensions:this.extensions,astNode:this.astNode,extensionASTNodes:null!==(e=this.extensionASTNodes)&&void 0!==e?e:[]}},t.toString=function(){return this.name},t.toJSON=function(){return this.toString()},D(e,[{key:i.c,get:function(){return"GraphQLScalarType"}}]),e}();Object(m.a)(ce);var le=function(){function e(e){this.name=e.name,this.description=e.description,this.isTypeOf=e.isTypeOf,this.extensions=e.extensions&&Object(u.a)(e.extensions),this.astNode=e.astNode,this.extensionASTNodes=ue(e.extensionASTNodes),this._fields=fe.bind(void 0,e),this._interfaces=pe.bind(void 0,e),"string"==typeof e.name||Object(c.a)(0,"Must provide name."),null==e.isTypeOf||"function"==typeof e.isTypeOf||Object(c.a)(0,"".concat(this.name,' must provide "isTypeOf" as a function, ')+"but got: ".concat(Object(o.a)(e.isTypeOf),"."))}var t=e.prototype;return t.getFields=function(){return"function"==typeof this._fields&&(this._fields=this._fields()),this._fields},t.getInterfaces=function(){return"function"==typeof this._interfaces&&(this._interfaces=this._interfaces()),this._interfaces},t.toConfig=function(){return{name:this.name,description:this.description,interfaces:this.getInterfaces(),fields:he(this.getFields()),isTypeOf:this.isTypeOf,extensions:this.extensions,astNode:this.astNode,extensionASTNodes:this.extensionASTNodes||[]}},t.toString=function(){return this.name},t.toJSON=function(){return this.toString()},D(e,[{key:i.c,get:function(){return"GraphQLObjectType"}}]),e}();function pe(e){var t,n=null!==(t=se(e.interfaces))&&void 0!==t?t:[];return Array.isArray(n)||Object(c.a)(0,"".concat(e.name," interfaces must be an Array or a function which returns an Array.")),n}function fe(e){var t=se(e.fields);return de(t)||Object(c.a)(0,"".concat(e.name," fields must be an object with field names as keys or a function which returns such an object.")),Object(s.a)(t,(function(t,n){var i;de(t)||Object(c.a)(0,"".concat(e.name,".").concat(n," field config must be an object.")),!("isDeprecated"in t)||Object(c.a)(0,"".concat(e.name,".").concat(n,' should provide "deprecationReason" instead of "isDeprecated".')),null==t.resolve||"function"==typeof t.resolve||Object(c.a)(0,"".concat(e.name,".").concat(n," field resolver must be a function if ")+"provided, but got: ".concat(Object(o.a)(t.resolve),"."));var a=null!==(i=t.args)&&void 0!==i?i:{};de(a)||Object(c.a)(0,"".concat(e.name,".").concat(n," args must be an object with argument names as keys."));var s=Object(r.a)(a).map((function(e){var t=e[0],n=e[1];return{name:t,description:n.description,type:n.type,defaultValue:n.defaultValue,extensions:n.extensions&&Object(u.a)(n.extensions),astNode:n.astNode}}));return{name:n,description:t.description,type:t.type,args:s,resolve:t.resolve,subscribe:t.subscribe,isDeprecated:null!=t.deprecationReason,deprecationReason:t.deprecationReason,extensions:t.extensions&&Object(u.a)(t.extensions),astNode:t.astNode}}))}function de(e){return Object(d.a)(e)&&!Array.isArray(e)}function he(e){return Object(s.a)(e,(function(e){return{description:e.description,type:e.type,args:me(e.args),resolve:e.resolve,subscribe:e.subscribe,deprecationReason:e.deprecationReason,extensions:e.extensions,astNode:e.astNode}}))}function me(e){return Object(l.a)(e,(function(e){return e.name}),(function(e){return{description:e.description,type:e.type,defaultValue:e.defaultValue,extensions:e.extensions,astNode:e.astNode}}))}function ge(e){return B(e.type)&&void 0===e.defaultValue}Object(m.a)(le);var ye=function(){function e(e){this.name=e.name,this.description=e.description,this.resolveType=e.resolveType,this.extensions=e.extensions&&Object(u.a)(e.extensions),this.astNode=e.astNode,this.extensionASTNodes=ue(e.extensionASTNodes),this._fields=fe.bind(void 0,e),this._interfaces=pe.bind(void 0,e),"string"==typeof e.name||Object(c.a)(0,"Must provide name."),null==e.resolveType||"function"==typeof e.resolveType||Object(c.a)(0,"".concat(this.name,' must provide "resolveType" as a function, ')+"but got: ".concat(Object(o.a)(e.resolveType),"."))}var t=e.prototype;return t.getFields=function(){return"function"==typeof this._fields&&(this._fields=this._fields()),this._fields},t.getInterfaces=function(){return"function"==typeof this._interfaces&&(this._interfaces=this._interfaces()),this._interfaces},t.toConfig=function(){var e;return{name:this.name,description:this.description,interfaces:this.getInterfaces(),fields:he(this.getFields()),resolveType:this.resolveType,extensions:this.extensions,astNode:this.astNode,extensionASTNodes:null!==(e=this.extensionASTNodes)&&void 0!==e?e:[]}},t.toString=function(){return this.name},t.toJSON=function(){return this.toString()},D(e,[{key:i.c,get:function(){return"GraphQLInterfaceType"}}]),e}();Object(m.a)(ye);var ve=function(){function e(e){this.name=e.name,this.description=e.description,this.resolveType=e.resolveType,this.extensions=e.extensions&&Object(u.a)(e.extensions),this.astNode=e.astNode,this.extensionASTNodes=ue(e.extensionASTNodes),this._types=be.bind(void 0,e),"string"==typeof e.name||Object(c.a)(0,"Must provide name."),null==e.resolveType||"function"==typeof e.resolveType||Object(c.a)(0,"".concat(this.name,' must provide "resolveType" as a function, ')+"but got: ".concat(Object(o.a)(e.resolveType),"."))}var t=e.prototype;return t.getTypes=function(){return"function"==typeof this._types&&(this._types=this._types()),this._types},t.toConfig=function(){var e;return{name:this.name,description:this.description,types:this.getTypes(),resolveType:this.resolveType,extensions:this.extensions,astNode:this.astNode,extensionASTNodes:null!==(e=this.extensionASTNodes)&&void 0!==e?e:[]}},t.toString=function(){return this.name},t.toJSON=function(){return this.toString()},D(e,[{key:i.c,get:function(){return"GraphQLUnionType"}}]),e}();function be(e){var t=se(e.types);return Array.isArray(t)||Object(c.a)(0,"Must provide Array of types or a function which returns such an array for Union ".concat(e.name,".")),t}Object(m.a)(ve);var Ee=function(){function e(e){var t,n;this.name=e.name,this.description=e.description,this.extensions=e.extensions&&Object(u.a)(e.extensions),this.astNode=e.astNode,this.extensionASTNodes=ue(e.extensionASTNodes),this._values=(t=this.name,de(n=e.values)||Object(c.a)(0,"".concat(t," values must be an object with value names as keys.")),Object(r.a)(n).map((function(e){var n=e[0],r=e[1];return de(r)||Object(c.a)(0,"".concat(t,".").concat(n,' must refer to an object with a "value" key ')+"representing an internal value but got: ".concat(Object(o.a)(r),".")),!("isDeprecated"in r)||Object(c.a)(0,"".concat(t,".").concat(n,' should provide "deprecationReason" instead of "isDeprecated".')),{name:n,description:r.description,value:void 0!==r.value?r.value:n,isDeprecated:null!=r.deprecationReason,deprecationReason:r.deprecationReason,extensions:r.extensions&&Object(u.a)(r.extensions),astNode:r.astNode}}))),this._valueLookup=new Map(this._values.map((function(e){return[e.value,e]}))),this._nameLookup=Object(a.a)(this._values,(function(e){return e.name})),"string"==typeof e.name||Object(c.a)(0,"Must provide name.")}var t=e.prototype;return t.getValues=function(){return this._values},t.getValue=function(e){return this._nameLookup[e]},t.serialize=function(e){var t=this._valueLookup.get(e);if(void 0===t)throw new y.a('Enum "'.concat(this.name,'" cannot represent value: ').concat(Object(o.a)(e)));return t.name},t.parseValue=function(e){if("string"!=typeof e){var t=Object(o.a)(e);throw new y.a('Enum "'.concat(this.name,'" cannot represent non-string value: ').concat(t,".")+xe(this,t))}var n=this.getValue(e);if(null==n)throw new y.a('Value "'.concat(e,'" does not exist in "').concat(this.name,'" enum.')+xe(this,e));return n.value},t.parseLiteral=function(e,t){if(e.kind!==v.a.ENUM){var n=Object(b.print)(e);throw new y.a('Enum "'.concat(this.name,'" cannot represent non-enum value: ').concat(n,".")+xe(this,n),e)}var r=this.getValue(e.value);if(null==r){var i=Object(b.print)(e);throw new y.a('Value "'.concat(i,'" does not exist in "').concat(this.name,'" enum.')+xe(this,i),e)}return r.value},t.toConfig=function(){var e,t=Object(l.a)(this.getValues(),(function(e){return e.name}),(function(e){return{description:e.description,value:e.value,deprecationReason:e.deprecationReason,extensions:e.extensions,astNode:e.astNode}}));return{name:this.name,description:this.description,values:t,extensions:this.extensions,astNode:this.astNode,extensionASTNodes:null!==(e=this.extensionASTNodes)&&void 0!==e?e:[]}},t.toString=function(){return this.name},t.toJSON=function(){return this.toString()},D(e,[{key:i.c,get:function(){return"GraphQLEnumType"}}]),e}();function xe(e,t){var n=e.getValues().map((function(e){return e.name})),r=Object(g.a)(t,n);return Object(f.a)("the enum value",r)}Object(m.a)(Ee);var De=function(){function e(e){this.name=e.name,this.description=e.description,this.extensions=e.extensions&&Object(u.a)(e.extensions),this.astNode=e.astNode,this.extensionASTNodes=ue(e.extensionASTNodes),this._fields=Ce.bind(void 0,e),"string"==typeof e.name||Object(c.a)(0,"Must provide name.")}var t=e.prototype;return t.getFields=function(){return"function"==typeof this._fields&&(this._fields=this._fields()),this._fields},t.toConfig=function(){var e,t=Object(s.a)(this.getFields(),(function(e){return{description:e.description,type:e.type,defaultValue:e.defaultValue,extensions:e.extensions,astNode:e.astNode}}));return{name:this.name,description:this.description,fields:t,extensions:this.extensions,astNode:this.astNode,extensionASTNodes:null!==(e=this.extensionASTNodes)&&void 0!==e?e:[]}},t.toString=function(){return this.name},t.toJSON=function(){return this.toString()},D(e,[{key:i.c,get:function(){return"GraphQLInputObjectType"}}]),e}();function Ce(e){var t=se(e.fields);return de(t)||Object(c.a)(0,"".concat(e.name," fields must be an object with field names as keys or a function which returns such an object.")),Object(s.a)(t,(function(t,n){return!("resolve"in t)||Object(c.a)(0,"".concat(e.name,".").concat(n," field has a resolve property, but Input Types cannot define resolvers.")),{name:n,description:t.description,type:t.type,defaultValue:t.defaultValue,extensions:t.extensions&&Object(u.a)(t.extensions),astNode:t.astNode}}))}function we(e){return B(e.type)&&void 0===e.defaultValue}Object(m.a)(De)},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var r=Object.freeze({NAME:"Name",DOCUMENT:"Document",OPERATION_DEFINITION:"OperationDefinition",VARIABLE_DEFINITION:"VariableDefinition",SELECTION_SET:"SelectionSet",FIELD:"Field",ARGUMENT:"Argument",FRAGMENT_SPREAD:"FragmentSpread",INLINE_FRAGMENT:"InlineFragment",FRAGMENT_DEFINITION:"FragmentDefinition",VARIABLE:"Variable",INT:"IntValue",FLOAT:"FloatValue",STRING:"StringValue",BOOLEAN:"BooleanValue",NULL:"NullValue",ENUM:"EnumValue",LIST:"ListValue",OBJECT:"ObjectValue",OBJECT_FIELD:"ObjectField",DIRECTIVE:"Directive",NAMED_TYPE:"NamedType",LIST_TYPE:"ListType",NON_NULL_TYPE:"NonNullType",SCHEMA_DEFINITION:"SchemaDefinition",OPERATION_TYPE_DEFINITION:"OperationTypeDefinition",SCALAR_TYPE_DEFINITION:"ScalarTypeDefinition",OBJECT_TYPE_DEFINITION:"ObjectTypeDefinition",FIELD_DEFINITION:"FieldDefinition",INPUT_VALUE_DEFINITION:"InputValueDefinition",INTERFACE_TYPE_DEFINITION:"InterfaceTypeDefinition",UNION_TYPE_DEFINITION:"UnionTypeDefinition",ENUM_TYPE_DEFINITION:"EnumTypeDefinition",ENUM_VALUE_DEFINITION:"EnumValueDefinition",INPUT_OBJECT_TYPE_DEFINITION:"InputObjectTypeDefinition",DIRECTIVE_DEFINITION:"DirectiveDefinition",SCHEMA_EXTENSION:"SchemaExtension",SCALAR_TYPE_EXTENSION:"ScalarTypeExtension",OBJECT_TYPE_EXTENSION:"ObjectTypeExtension",INTERFACE_TYPE_EXTENSION:"InterfaceTypeExtension",UNION_TYPE_EXTENSION:"UnionTypeExtension",ENUM_TYPE_EXTENSION:"EnumTypeExtension",INPUT_OBJECT_TYPE_EXTENSION:"InputObjectTypeExtension"})},function(e,t,n){"use strict";n.d(t,"a",(function(){return g})),n.d(t,"b",(function(){return y}));var r=n(31),i=n(25),o=n(94),a=n(137);function s(e){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function u(e,t){for(var n=0;n2)return"[Array]";for(var n=Math.min(10,e.length),r=e.length-n,i=[],o=0;o1&&i.push("... ".concat(r," more items"));return"["+i.join(", ")+"]"}(e,n);return function(e,t){var n=Object.keys(e);if(0===n.length)return"{}";if(t.length>2)return"["+function(e){var t=Object.prototype.toString.call(e).replace(/^\[object /,"").replace(/]$/,"");if("Object"===t&&"function"==typeof e.constructor){var n=e.constructor.name;if("string"==typeof n&&""!==n)return n}return t}(e)+"]";return"{ "+n.map((function(n){return n+": "+a(e[n],t)})).join(", ")+" }"}(e,n)}(e,t);default:return String(e)}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var r=Object.freeze({SOF:"",EOF:"",BANG:"!",DOLLAR:"$",AMP:"&",PAREN_L:"(",PAREN_R:")",SPREAD:"...",COLON:":",EQUALS:"=",AT:"@",BRACKET_L:"[",BRACKET_R:"]",BRACE_L:"{",PIPE:"|",BRACE_R:"}",NAME:"Name",INT:"Int",FLOAT:"Float",STRING:"String",BLOCK_STRING:"BlockString",COMMENT:"Comment"})},function(e,t,n){"use strict";n.d(t,"a",(function(){return ae})),n.d(t,"b",(function(){return L})),n.d(t,"c",(function(){return v})),n.d(t,"d",(function(){return R})),n.d(t,"e",(function(){return x})),n.d(t,"f",(function(){return c})),n.d(t,"g",(function(){return U})),n.d(t,"h",(function(){return K})),n.d(t,"i",(function(){return I})),n.d(t,"j",(function(){return $})),n.d(t,"k",(function(){return z})),n.d(t,"l",(function(){return X})),n.d(t,"m",(function(){return ue})),n.d(t,"n",(function(){return pe})),n.d(t,"o",(function(){return oe})),n.d(t,"p",(function(){return de})),n.d(t,"q",(function(){return j})),n.d(t,"r",(function(){return F})),n.d(t,"s",(function(){return P})),n.d(t,"t",(function(){return q})),n.d(t,"u",(function(){return M})),n.d(t,"v",(function(){return ve})),n.d(t,"w",(function(){return re})),n.d(t,"x",(function(){return Q})),n.d(t,"y",(function(){return Z})),n.d(t,"z",(function(){return ee})),n.d(t,"A",(function(){return te})),n.d(t,"B",(function(){return ne})),n.d(t,"C",(function(){return B})),n.d(t,"D",(function(){return se})),n.d(t,"E",(function(){return ce})),n.d(t,"F",(function(){return le})),n.d(t,"G",(function(){return fe})),n.d(t,"H",(function(){return he})),n.d(t,"I",(function(){return me})),n.d(t,"J",(function(){return ge})),n.d(t,"K",(function(){return ye})),n.d(t,"L",(function(){return V})),n.d(t,"M",(function(){return l})),n.d(t,"N",(function(){return H})),n.d(t,"O",(function(){return N})),n.d(t,"P",(function(){return W})),n.d(t,"Q",(function(){return G})),n.d(t,"R",(function(){return J})),n.d(t,"S",(function(){return b})),n.d(t,"T",(function(){return _})),n.d(t,"U",(function(){return s})),n.d(t,"V",(function(){return S})),n.d(t,"W",(function(){return E})),n.d(t,"X",(function(){return O})),n.d(t,"Y",(function(){return h})),n.d(t,"Z",(function(){return p})),n.d(t,"ab",(function(){return y})),n.d(t,"bb",(function(){return d})),n.d(t,"cb",(function(){return w})),n.d(t,"db",(function(){return u})),n.d(t,"eb",(function(){return f})),n.d(t,"fb",(function(){return k})),n.d(t,"gb",(function(){return C})),n.d(t,"hb",(function(){return D}));var r=n(19),i=n(63),o=n(10),a=n(109),s=function(e){return function(){return e}}(!0),u=function(){};var c=function(e){return e};"function"==typeof Symbol&&Symbol.asyncIterator&&Symbol.asyncIterator;function l(e,t,n){if(!t(e))throw new Error(n)}var p=function(e,t){Object(i.a)(e,t),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach((function(n){e[n]=t[n]}))},f=function(e,t){var n;return(n=[]).concat.apply(n,t.map(e))};function d(e,t){var n=e.indexOf(t);n>=0&&e.splice(n,1)}function h(e){var t=!1;return function(){t||(t=!0,e())}}var m=function(e){throw e},g=function(e){return{value:e,done:!0}};function y(e,t,n){void 0===t&&(t=m),void 0===n&&(n="iterator");var r={meta:{name:n},next:e,throw:t,return:g,isSagaIterator:!0};return"undefined"!=typeof Symbol&&(r[Symbol.iterator]=function(){return r}),r}function v(e,t){var n=t.sagaStack;console.error(e),console.error(n)}var b=function(e){return new Error("\n redux-saga: Error checking hooks detected an inconsistent state. This is likely a bug\n in redux-saga code and not yours. Thanks for reporting this in the project's github repo.\n Error: "+e+"\n")},E=function(e){return Array.apply(null,new Array(e))},x=function(e){return function(t){return e(Object.defineProperty(t,r.f,{value:!0}))}},D=function(e){return e===r.k},C=function(e){return e===r.j},w=function(e){return D(e)||C(e)};function S(e,t){var n=Object.keys(e),r=n.length;var i,a=0,s=Object(o.a)(e)?E(r):{},c={};return n.forEach((function(e){var n=function(n,o){i||(o||w(n)?(t.cancel(),t(n,o)):(s[e]=n,++a===r&&(i=!0,t(s))))};n.cancel=u,c[e]=n})),t.cancel=function(){i||(i=!0,n.forEach((function(e){return c[e].cancel()})))},c}function _(e){return{name:e.name||"anonymous",location:k(e)}}function k(e){return e[r.g]}var A={isEmpty:s,put:u,take:u};function T(e,t){void 0===e&&(e=10);var n=new Array(e),r=0,i=0,o=0,a=function(t){n[i]=t,i=(i+1)%e,r++},s=function(){if(0!=r){var t=n[o];return n[o]=null,r--,o=(o+1)%e,t}},u=function(){for(var e=[];r;)e.push(s());return e};return{isEmpty:function(){return 0==r},put:function(s){var c;if(r1?t-1:0),r=1;r1?t-1:0),r=1;r1?t-1:0),r=1;r1?t-1:0),r=1;r1?t-1:0),r=1;r2147483647||n<-2147483648)throw new c.a("Int cannot represent non 32-bit signed integer value: "+Object(o.a)(t));return n},parseValue:function(e){if(!i(e))throw new c.a("Int cannot represent non-integer value: ".concat(Object(o.a)(e)));if(e>2147483647||e<-2147483648)throw new c.a("Int cannot represent non 32-bit signed integer value: ".concat(e));return e},parseLiteral:function(e){if(e.kind!==s.a.INT)throw new c.a("Int cannot represent non-integer value: ".concat(Object(u.print)(e)),e);var t=parseInt(e.value,10);if(t>2147483647||t<-2147483648)throw new c.a("Int cannot represent non 32-bit signed integer value: ".concat(e.value),e);return t}});var f=new l.g({name:"Float",description:"The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).",serialize:function(e){var t=d(e);if("boolean"==typeof t)return t?1:0;var n=t;if("string"==typeof t&&""!==t&&(n=Number(t)),!Object(r.a)(n))throw new c.a("Float cannot represent non numeric value: ".concat(Object(o.a)(t)));return n},parseValue:function(e){if(!Object(r.a)(e))throw new c.a("Float cannot represent non numeric value: ".concat(Object(o.a)(e)));return e},parseLiteral:function(e){if(e.kind!==s.a.FLOAT&&e.kind!==s.a.INT)throw new c.a("Float cannot represent non numeric value: ".concat(Object(u.print)(e)),e);return parseFloat(e.value)}});function d(e){if(Object(a.a)(e)){if("function"==typeof e.valueOf){var t=e.valueOf();if(!Object(a.a)(t))return t}if("function"==typeof e.toJSON)return e.toJSON()}return e}var h=new l.g({name:"String",description:"The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.",serialize:function(e){var t=d(e);if("string"==typeof t)return t;if("boolean"==typeof t)return t?"true":"false";if(Object(r.a)(t))return t.toString();throw new c.a("String cannot represent value: ".concat(Object(o.a)(e)))},parseValue:function(e){if("string"!=typeof e)throw new c.a("String cannot represent a non string value: ".concat(Object(o.a)(e)));return e},parseLiteral:function(e){if(e.kind!==s.a.STRING)throw new c.a("String cannot represent a non string value: ".concat(Object(u.print)(e)),e);return e.value}});var m=new l.g({name:"Boolean",description:"The `Boolean` scalar type represents `true` or `false`.",serialize:function(e){var t=d(e);if("boolean"==typeof t)return t;if(Object(r.a)(t))return 0!==t;throw new c.a("Boolean cannot represent a non boolean value: ".concat(Object(o.a)(t)))},parseValue:function(e){if("boolean"!=typeof e)throw new c.a("Boolean cannot represent a non boolean value: ".concat(Object(o.a)(e)));return e},parseLiteral:function(e){if(e.kind!==s.a.BOOLEAN)throw new c.a("Boolean cannot represent a non boolean value: ".concat(Object(u.print)(e)),e);return e.value}});var g=new l.g({name:"ID",description:'The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID.',serialize:function(e){var t=d(e);if("string"==typeof t)return t;if(i(t))return String(t);throw new c.a("ID cannot represent value: ".concat(Object(o.a)(e)))},parseValue:function(e){if("string"==typeof e)return e;if(i(e))return e.toString();throw new c.a("ID cannot represent value: ".concat(Object(o.a)(e)))},parseLiteral:function(e){if(e.kind!==s.a.STRING&&e.kind!==s.a.INT)throw new c.a("ID cannot represent a non-string and non-integer value: "+Object(u.print)(e),e);return e.value}}),y=Object.freeze([h,p,f,m,g]);function v(e){return y.some((function(t){var n=t.name;return e.name===n}))}},function(e,t,n){"use strict";var r=Object.values||function(e){return Object.keys(e).map((function(t){return e[t]}))};t.a=r},function(e,t,n){"use strict";n.r(t),n.d(t,"print",(function(){return o}));var r=n(26),i=n(52);function o(e){return Object(r.c)(e,{leave:a})}var a={Name:function(e){return e.value},Variable:function(e){return"$"+e.name},Document:function(e){return u(e.definitions,"\n\n")+"\n"},OperationDefinition:function(e){var t=e.operation,n=e.name,r=l("(",u(e.variableDefinitions,", "),")"),i=u(e.directives," "),o=e.selectionSet;return n||i||r||"query"!==t?u([t,u([n,r]),i,o]," "):o},VariableDefinition:function(e){var t=e.variable,n=e.type,r=e.defaultValue,i=e.directives;return t+": "+n+l(" = ",r)+l(" ",u(i," "))},SelectionSet:function(e){return c(e.selections)},Field:function(e){var t=e.alias,n=e.name,r=e.arguments,i=e.directives,o=e.selectionSet;return u([l("",t,": ")+n+l("(",u(r,", "),")"),u(i," "),o]," ")},Argument:function(e){return e.name+": "+e.value},FragmentSpread:function(e){return"..."+e.name+l(" ",u(e.directives," "))},InlineFragment:function(e){var t=e.typeCondition,n=e.directives,r=e.selectionSet;return u(["...",l("on ",t),u(n," "),r]," ")},FragmentDefinition:function(e){var t=e.name,n=e.typeCondition,r=e.variableDefinitions,i=e.directives,o=e.selectionSet;return"fragment ".concat(t).concat(l("(",u(r,", "),")")," ")+"on ".concat(n," ").concat(l("",u(i," ")," "))+o},IntValue:function(e){return e.value},FloatValue:function(e){return e.value},StringValue:function(e,t){var n=e.value;return e.block?Object(i.c)(n,"description"===t?"":" "):JSON.stringify(n)},BooleanValue:function(e){return e.value?"true":"false"},NullValue:function(){return"null"},EnumValue:function(e){return e.value},ListValue:function(e){return"["+u(e.values,", ")+"]"},ObjectValue:function(e){return"{"+u(e.fields,", ")+"}"},ObjectField:function(e){return e.name+": "+e.value},Directive:function(e){return"@"+e.name+l("(",u(e.arguments,", "),")")},NamedType:function(e){return e.name},ListType:function(e){return"["+e.type+"]"},NonNullType:function(e){return e.type+"!"},SchemaDefinition:s((function(e){var t=e.directives,n=e.operationTypes;return u(["schema",u(t," "),c(n)]," ")})),OperationTypeDefinition:function(e){return e.operation+": "+e.type},ScalarTypeDefinition:s((function(e){return u(["scalar",e.name,u(e.directives," ")]," ")})),ObjectTypeDefinition:s((function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return u(["type",t,l("implements ",u(n," & ")),u(r," "),c(i)]," ")})),FieldDefinition:s((function(e){var t=e.name,n=e.arguments,r=e.type,i=e.directives;return t+(d(n)?l("(\n",p(u(n,"\n")),"\n)"):l("(",u(n,", "),")"))+": "+r+l(" ",u(i," "))})),InputValueDefinition:s((function(e){var t=e.name,n=e.type,r=e.defaultValue,i=e.directives;return u([t+": "+n,l("= ",r),u(i," ")]," ")})),InterfaceTypeDefinition:s((function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return u(["interface",t,l("implements ",u(n," & ")),u(r," "),c(i)]," ")})),UnionTypeDefinition:s((function(e){var t=e.name,n=e.directives,r=e.types;return u(["union",t,u(n," "),r&&0!==r.length?"= "+u(r," | "):""]," ")})),EnumTypeDefinition:s((function(e){var t=e.name,n=e.directives,r=e.values;return u(["enum",t,u(n," "),c(r)]," ")})),EnumValueDefinition:s((function(e){return u([e.name,u(e.directives," ")]," ")})),InputObjectTypeDefinition:s((function(e){var t=e.name,n=e.directives,r=e.fields;return u(["input",t,u(n," "),c(r)]," ")})),DirectiveDefinition:s((function(e){var t=e.name,n=e.arguments,r=e.repeatable,i=e.locations;return"directive @"+t+(d(n)?l("(\n",p(u(n,"\n")),"\n)"):l("(",u(n,", "),")"))+(r?" repeatable":"")+" on "+u(i," | ")})),SchemaExtension:function(e){var t=e.directives,n=e.operationTypes;return u(["extend schema",u(t," "),c(n)]," ")},ScalarTypeExtension:function(e){return u(["extend scalar",e.name,u(e.directives," ")]," ")},ObjectTypeExtension:function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return u(["extend type",t,l("implements ",u(n," & ")),u(r," "),c(i)]," ")},InterfaceTypeExtension:function(e){var t=e.name,n=e.interfaces,r=e.directives,i=e.fields;return u(["extend interface",t,l("implements ",u(n," & ")),u(r," "),c(i)]," ")},UnionTypeExtension:function(e){var t=e.name,n=e.directives,r=e.types;return u(["extend union",t,u(n," "),r&&0!==r.length?"= "+u(r," | "):""]," ")},EnumTypeExtension:function(e){var t=e.name,n=e.directives,r=e.values;return u(["extend enum",t,u(n," "),c(r)]," ")},InputObjectTypeExtension:function(e){var t=e.name,n=e.directives,r=e.fields;return u(["extend input",t,u(n," "),c(r)]," ")}};function s(e){return function(t){return u([t.description,e(t)],"\n")}}function u(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return null!==(t=null==e?void 0:e.filter((function(e){return e})).join(n))&&void 0!==t?t:""}function c(e){return e&&0!==e.length?"{\n"+p(u(e,"\n"))+"\n}":""}function l(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return t?e+t+n:""}function p(e){return e&&" "+e.replace(/\n/g,"\n ")}function f(e){return-1!==e.indexOf("\n")}function d(e){return e&&e.some(f)}},function(e,t,n){e.exports=function(){"use strict";var e=navigator.userAgent,t=navigator.platform,n=/gecko\/\d/i.test(e),r=/MSIE \d/.test(e),i=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(e),o=/Edge\/(\d+)/.exec(e),a=r||i||o,s=a&&(r?document.documentMode||6:+(o||i)[1]),u=!o&&/WebKit\//.test(e),c=u&&/Qt\/\d+\.\d+/.test(e),l=!o&&/Chrome\//.test(e),p=/Opera\//.test(e),f=/Apple Computer/.test(navigator.vendor),d=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(e),h=/PhantomJS/.test(e),m=!o&&/AppleWebKit/.test(e)&&/Mobile\/\w+/.test(e),g=/Android/.test(e),y=m||g||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),v=m||/Mac/.test(t),b=/\bCrOS\b/.test(e),E=/win/i.test(t),x=p&&e.match(/Version\/(\d*\.\d*)/);x&&(x=Number(x[1])),x&&x>=15&&(p=!1,u=!0);var D=v&&(c||p&&(null==x||x<12.11)),C=n||a&&s>=9;function w(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}var S,_=function(e,t){var n=e.className,r=w(t).exec(n);if(r){var i=n.slice(r.index+r[0].length);e.className=n.slice(0,r.index)+(i?r[1]+i:"")}};function k(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function A(e,t){return k(e).appendChild(t)}function T(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o=t)return a+(t-o);a+=s-o,a+=n-a%n,o=s+1}}m?j=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:a&&(j=function(e){try{e.select()}catch(e){}});var B=function(){this.id=null,this.f=null,this.time=0,this.handler=L(this.onTimeout,this)};function U(e,t){for(var n=0;n=t)return r+Math.min(a,t-i);if(i+=o-r,r=o+1,(i+=n-i%n)>=t)return r}}var G=[""];function K(e){for(;G.length<=e;)G.push(J(G)+" ");return G[e]}function J(e){return e[e.length-1]}function Q(e,t){for(var n=[],r=0;r"€"&&(e.toUpperCase()!=e.toLowerCase()||X.test(e))}function ee(e,t){return t?!!(t.source.indexOf("\\w")>-1&&Z(e))||t.test(e):Z(e)}function te(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var ne=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function re(e){return e.charCodeAt(0)>=768&&ne.test(e)}function ie(e,t,n){for(;(n<0?t>0:tn?-1:1;;){if(t==n)return t;var i=(t+n)/2,o=r<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:n;e(o)?n=o:t=o+r}}var ae=null;function se(e,t,n){var r;ae=null;for(var i=0;it)return i;o.to==t&&(o.from!=o.to&&"before"==n?r=i:ae=i),o.from==t&&(o.from!=o.to&&"before"!=n?r=i:ae=i)}return null!=r?r:ae}var ue=function(){var e=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,t=/[stwN]/,n=/[LRr]/,r=/[Lb1n]/,i=/[1n]/;function o(e,t,n){this.level=e,this.from=t,this.to=n}return function(a,s){var u="ltr"==s?"L":"R";if(0==a.length||"ltr"==s&&!e.test(a))return!1;for(var c,l=a.length,p=[],f=0;f-1&&(r[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function he(e,t){var n=fe(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i0}function ve(e){e.prototype.on=function(e,t){pe(this,e,t)},e.prototype.off=function(e,t){de(this,e,t)}}function be(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function Ee(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function xe(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function De(e){be(e),Ee(e)}function Ce(e){return e.target||e.srcElement}function we(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),v&&e.ctrlKey&&1==t&&(t=3),t}var Se,_e,ke=function(){if(a&&s<9)return!1;var e=T("div");return"draggable"in e||"dragDrop"in e}();function Ae(e){if(null==Se){var t=T("span","​");A(e,T("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(Se=t.offsetWidth<=1&&t.offsetHeight>2&&!(a&&s<8))}var n=Se?T("span","​"):T("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}function Te(e){if(null!=_e)return _e;var t=A(e,document.createTextNode("AخA")),n=S(t,0,1).getBoundingClientRect(),r=S(t,1,2).getBoundingClientRect();return k(e),!(!n||n.left==n.right)&&(_e=r.right-n.right<3)}var Oe,Fe=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),a=o.indexOf("\r");-1!=a?(n.push(o.slice(0,a)),t+=a+1):(n.push(o),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},Ne=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},Ie="oncopy"in(Oe=T("div"))||(Oe.setAttribute("oncopy","return;"),"function"==typeof Oe.oncopy),Me=null,je={},Le={};function Pe(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),je[e]=t}function Re(e){if("string"==typeof e&&Le.hasOwnProperty(e))e=Le[e];else if(e&&"string"==typeof e.name&&Le.hasOwnProperty(e.name)){var t=Le[e.name];"string"==typeof t&&(t={name:t}),(e=$(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Re("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Re("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function Be(e,t){t=Re(t);var n=je[t.name];if(!n)return Be(e,"text/plain");var r=n(e,t);if(Ue.hasOwnProperty(t.name)){var i=Ue[t.name];for(var o in i)i.hasOwnProperty(o)&&(r.hasOwnProperty(o)&&(r["_"+o]=r[o]),r[o]=i[o])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var a in t.modeProps)r[a]=t.modeProps[a];return r}var Ue={};function ze(e,t){P(t,Ue.hasOwnProperty(e)?Ue[e]:Ue[e]={})}function Ve(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n}function qe(e,t){for(var n;e.innerMode&&(n=e.innerMode(t))&&n.mode!=e;)t=n.state,e=n.mode;return n||{mode:e,state:t}}function He(e,t,n){return!e.startState||e.startState(t,n)}var We=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};function Ge(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],o=i.chunkSize();if(t=e.first&&tn?et(n,Ge(e,n).text.length):function(e,t){var n=e.ch;return null==n||n>t?et(e.line,t):n<0?et(e.line,0):e}(t,Ge(e,t.line).text.length)}function ut(e,t){for(var n=[],r=0;r=this.string.length},We.prototype.sol=function(){return this.pos==this.lineStart},We.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},We.prototype.next=function(){if(this.post},We.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},We.prototype.skipToEnd=function(){this.pos=this.string.length},We.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},We.prototype.backUp=function(e){this.pos-=e},We.prototype.column=function(){return this.lastColumnPos0?null:(r&&!1!==t&&(this.pos+=r[0].length),r)}var i=function(e){return n?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},We.prototype.current=function(){return this.string.slice(this.start,this.pos)},We.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},We.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},We.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var ct=function(e,t){this.state=e,this.lookAhead=t},lt=function(e,t,n,r){this.state=t,this.doc=e,this.line=n,this.maxLookAhead=r||0,this.baseTokens=null,this.baseTokenPos=1};function pt(e,t,n,r){var i=[e.state.modeGen],o={};Et(e,t.text,e.doc.mode,n,(function(e,t){return i.push(e,t)}),o,r);for(var a=n.state,s=function(r){n.baseTokens=i;var s=e.state.overlays[r],u=1,c=0;n.state=!0,Et(e,t.text,s.mode,n,(function(e,t){for(var n=u;ce&&i.splice(u,1,e,i[u+1],r),u+=2,c=Math.min(e,r)}if(t)if(s.opaque)i.splice(n,u-n,e,"overlay "+t),u=n+2;else for(;ne.options.maxHighlightLength&&Ve(e.doc.mode,r.state),o=pt(e,t,r);i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function dt(e,t,n){var r=e.doc,i=e.display;if(!r.mode.startState)return new lt(r,!0,t);var o=function(e,t,n){for(var r,i,o=e.doc,a=n?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>a;--s){if(s<=o.first)return o.first;var u=Ge(o,s-1),c=u.stateAfter;if(c&&(!n||s+(c instanceof ct?c.lookAhead:0)<=o.modeFrontier))return s;var l=R(u.text,null,e.options.tabSize);(null==i||r>l)&&(i=s-1,r=l)}return i}(e,t,n),a=o>r.first&&Ge(r,o-1).stateAfter,s=a?lt.fromSaved(r,a,o):new lt(r,He(r.mode),o);return r.iter(o,t,(function(n){ht(e,n.text,s);var r=s.line;n.stateAfter=r==t-1||r%5==0||r>=i.viewFrom&&rt.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}lt.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},lt.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},lt.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},lt.fromSaved=function(e,t,n){return t instanceof ct?new lt(e,Ve(e.mode,t.state),n,t.lookAhead):new lt(e,Ve(e.mode,t),n)},lt.prototype.save=function(e){var t=!1!==e?Ve(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new ct(t,this.maxLookAhead):t};var yt=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n};function vt(e,t,n,r){var i,o,a=e.doc,s=a.mode,u=Ge(a,(t=st(a,t)).line),c=dt(e,t.line,n),l=new We(u.text,e.options.tabSize,c);for(r&&(o=[]);(r||l.pose.options.maxHighlightLength?(s=!1,a&&ht(e,t,r,p.pos),p.pos=t.length,u=null):u=bt(gt(n,p,r.state,f),o),f){var d=f[0].name;d&&(u="m-"+(u?d+" "+u:d))}if(!s||l!=u){for(;c=t:o.to>t);(r||(r=[])).push(new Ct(a,o.from,s?null:o.to))}}return r}(n,i,a),u=function(e,t,n){var r;if(e)for(var i=0;i=t:o.to>t)||o.from==t&&"bookmark"==a.type&&(!n||o.marker.insertLeft)){var s=null==o.from||(a.inclusiveLeft?o.from<=t:o.from0&&s)for(var b=0;bt)&&(!n||Nt(n,o.marker)<0)&&(n=o.marker)}return n}function Pt(e,t,n,r,i){var o=Ge(e,t),a=Dt&&o.markedSpans;if(a)for(var s=0;s=0&&p<=0||l<=0&&p>=0)&&(l<=0&&(u.marker.inclusiveRight&&i.inclusiveLeft?tt(c.to,n)>=0:tt(c.to,n)>0)||l>=0&&(u.marker.inclusiveRight&&i.inclusiveLeft?tt(c.from,r)<=0:tt(c.from,r)<0)))return!0}}}function Rt(e){for(var t;t=Mt(e);)e=t.find(-1,!0).line;return e}function Bt(e,t){var n=Ge(e,t),r=Rt(n);return n==r?t:Ye(r)}function Ut(e,t){if(t>e.lastLine())return t;var n,r=Ge(e,t);if(!zt(e,r))return t;for(;n=jt(r);)r=n.find(1,!0).line;return Ye(r)+1}function zt(e,t){var n=Dt&&t.markedSpans;if(n)for(var r=void 0,i=0;it.maxLineLength&&(t.maxLineLength=n,t.maxLine=e)}))}var Gt=function(e,t,n){this.text=e,Tt(this,t),this.height=n?n(this):1};function Kt(e){e.parent=null,At(e)}Gt.prototype.lineNo=function(){return Ye(this)},ve(Gt);var Jt={},Qt={};function Yt(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?Qt:Jt;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function $t(e,t){var n=O("span",null,null,u?"padding-right: .1px":null),r={pre:O("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o=i?t.rest[i-1]:t.line,a=void 0;r.pos=0,r.addToken=Zt,Te(e.display.measure)&&(a=ce(o,e.doc.direction))&&(r.addToken=en(r.addToken,a)),r.map=[],nn(o,r,ft(e,o,t!=e.display.externalMeasured&&Ye(o))),o.styleClasses&&(o.styleClasses.bgClass&&(r.bgClass=M(o.styleClasses.bgClass,r.bgClass||"")),o.styleClasses.textClass&&(r.textClass=M(o.styleClasses.textClass,r.textClass||""))),0==r.map.length&&r.map.push(0,0,r.content.appendChild(Ae(e.display.measure))),0==i?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(u){var s=r.content.lastChild;(/\bcm-tab\b/.test(s.className)||s.querySelector&&s.querySelector(".cm-tab"))&&(r.content.className="cm-tab-wrap-hack")}return he(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=M(r.pre.className,r.textClass||"")),r}function Xt(e){var t=T("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Zt(e,t,n,r,i,o,u){if(t){var c,l=e.splitSpaces?function(e,t){if(e.length>1&&!/ /.test(e))return e;for(var n=t,r="",i=0;ic&&p.from<=c);f++);if(p.to>=l)return e(n,r,i,o,a,s,u);e(n,r.slice(0,p.to-c),i,o,null,s,u),o=null,r=r.slice(p.to-c),c=p.to}}}function tn(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",n.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function nn(e,t,n){var r=e.markedSpans,i=e.text,o=0;if(r)for(var a,s,u,c,l,p,f,d=i.length,h=0,m=1,g="",y=0;;){if(y==h){u=c=l=s="",f=null,p=null,y=1/0;for(var v=[],b=void 0,E=0;Eh||D.collapsed&&x.to==h&&x.from==h)){if(null!=x.to&&x.to!=h&&y>x.to&&(y=x.to,c=""),D.className&&(u+=" "+D.className),D.css&&(s=(s?s+";":"")+D.css),D.startStyle&&x.from==h&&(l+=" "+D.startStyle),D.endStyle&&x.to==y&&(b||(b=[])).push(D.endStyle,x.to),D.title&&((f||(f={})).title=D.title),D.attributes)for(var C in D.attributes)(f||(f={}))[C]=D.attributes[C];D.collapsed&&(!p||Nt(p.marker,D)<0)&&(p=x)}else x.from>h&&y>x.from&&(y=x.from)}if(b)for(var w=0;w=d)break;for(var _=Math.min(d,y);;){if(g){var k=h+g.length;if(!p){var A=k>_?g.slice(0,_-h):g;t.addToken(t,A,a?a+u:u,l,h+A.length==y?c:"",s,f)}if(k>=_){g=g.slice(_-h),h=_;break}h=k,l=""}g=i.slice(o,o=n[m++]),a=Yt(n[m++],t.cm.options)}}else for(var T=1;Tn)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function On(e,t,n,r){return In(e,Nn(e,t),n,r)}function Fn(e,t){if(t>=e.display.viewFrom&&t=n.lineN&&t2&&o.push((u.bottom+c.top)/2-n.top)}}o.push(n.bottom-n.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,n,r){var i,o=Ln(t.map,n,r),u=o.node,c=o.start,l=o.end,p=o.collapse;if(3==u.nodeType){for(var f=0;f<4;f++){for(;c&&re(t.line.text.charAt(o.coverStart+c));)--c;for(;o.coverStart+l1}(e))return t;var n=screen.logicalXDPI/screen.deviceXDPI,r=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*n,right:t.right*n,top:t.top*r,bottom:t.bottom*r}}(e.display.measure,i))}else{var d;c>0&&(p=r="right"),i=e.options.lineWrapping&&(d=u.getClientRects()).length>1?d["right"==r?d.length-1:0]:u.getBoundingClientRect()}if(a&&s<9&&!c&&(!i||!i.left&&!i.right)){var h=u.parentNode.getClientRects()[0];i=h?{left:h.left,right:h.left+ir(e.display),top:h.top,bottom:h.bottom}:jn}for(var m=i.top-t.rect.top,g=i.bottom-t.rect.top,y=(m+g)/2,v=t.view.measure.heights,b=0;bt)&&(i=(o=u-s)-1,t>=u&&(a="right")),null!=i){if(r=e[c+2],s==u&&n==(r.insertLeft?"left":"right")&&(a=n),"left"==n&&0==i)for(;c&&e[c-2]==e[c-3]&&e[c-1].insertLeft;)r=e[2+(c-=3)],a="left";if("right"==n&&i==u-s)for(;c=0&&(n=e[i]).left==n.right;i--);return n}function Rn(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t=r.text.length?(u=r.text.length,c="before"):u<=0&&(u=0,c="after"),!s)return a("before"==c?u-1:u,"before"==c);function l(e,t,n){return a(n?e-1:e,1==s[t].level!=n)}var p=se(s,u,c),f=ae,d=l(u,p,"before"==c);return null!=f&&(d.other=l(u,f,"before"!=c)),d}function Jn(e,t){var n=0;t=st(e.doc,t),e.options.lineWrapping||(n=ir(e.display)*t.ch);var r=Ge(e.doc,t.line),i=qt(r)+Cn(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function Qn(e,t,n,r,i){var o=et(e,t,n);return o.xRel=i,r&&(o.outside=r),o}function Yn(e,t,n){var r=e.doc;if((n+=e.display.viewOffset)<0)return Qn(r.first,0,null,-1,-1);var i=$e(r,n),o=r.first+r.size-1;if(i>o)return Qn(r.first+r.size-1,Ge(r,o).text.length,null,1,1);t<0&&(t=0);for(var a=Ge(r,i);;){var s=er(e,a,i,t,n),u=Lt(a,s.ch+(s.xRel>0||s.outside>0?1:0));if(!u)return s;var c=u.find(1);if(c.line==i)return c;a=Ge(r,i=c.line)}}function $n(e,t,n,r){r-=qn(t);var i=t.text.length,o=oe((function(t){return In(e,n,t-1).bottom<=r}),i,0);return{begin:o,end:i=oe((function(t){return In(e,n,t).top>r}),o,i)}}function Xn(e,t,n,r){return n||(n=Nn(e,t)),$n(e,t,n,Hn(e,t,In(e,n,r),"line").top)}function Zn(e,t,n,r){return!(e.bottom<=n)&&(e.top>n||(r?e.left:e.right)>t)}function er(e,t,n,r,i){i-=qt(t);var o=Nn(e,t),a=qn(t),s=0,u=t.text.length,c=!0,l=ce(t,e.doc.direction);if(l){var p=(e.options.lineWrapping?nr:tr)(e,t,n,o,l,r,i);s=(c=1!=p.level)?p.from:p.to-1,u=c?p.to:p.from-1}var f,d,h=null,m=null,g=oe((function(t){var n=In(e,o,t);return n.top+=a,n.bottom+=a,!!Zn(n,r,i,!1)&&(n.top<=i&&n.left<=r&&(h=t,m=n),!0)}),s,u),y=!1;if(m){var v=r-m.left=E.bottom?1:0}return Qn(n,g=ie(t.text,g,1),d,y,r-f)}function tr(e,t,n,r,i,o,a){var s=oe((function(s){var u=i[s],c=1!=u.level;return Zn(Kn(e,et(n,c?u.to:u.from,c?"before":"after"),"line",t,r),o,a,!0)}),0,i.length-1),u=i[s];if(s>0){var c=1!=u.level,l=Kn(e,et(n,c?u.from:u.to,c?"after":"before"),"line",t,r);Zn(l,o,a,!0)&&l.top>a&&(u=i[s-1])}return u}function nr(e,t,n,r,i,o,a){var s=$n(e,t,r,a),u=s.begin,c=s.end;/\s/.test(t.text.charAt(c-1))&&c--;for(var l=null,p=null,f=0;f=c||d.to<=u)){var h=In(e,r,1!=d.level?Math.min(c,d.to)-1:Math.max(u,d.from)).right,m=hm)&&(l=d,p=m)}}return l||(l=i[i.length-1]),l.fromc&&(l={from:l.from,to:c,level:l.level}),l}function rr(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Mn){Mn=T("pre",null,"CodeMirror-line-like");for(var t=0;t<49;++t)Mn.appendChild(document.createTextNode("x")),Mn.appendChild(T("br"));Mn.appendChild(document.createTextNode("x"))}A(e.measure,Mn);var n=Mn.offsetHeight/50;return n>3&&(e.cachedTextHeight=n),k(e.measure),n||1}function ir(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=T("span","xxxxxxxxxx"),n=T("pre",[t],"CodeMirror-line-like");A(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function or(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,o=t.gutters.firstChild,a=0;o;o=o.nextSibling,++a){var s=e.display.gutterSpecs[a].className;n[s]=o.offsetLeft+o.clientLeft+i,r[s]=o.clientWidth}return{fixedPos:ar(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function ar(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function sr(e){var t=rr(e.display),n=e.options.lineWrapping,r=n&&Math.max(5,e.display.scroller.clientWidth/ir(e.display)-3);return function(i){if(zt(e.doc,i))return 0;var o=0;if(i.widgets)for(var a=0;a0&&(u=Ge(e.doc,c.line).text).length==c.ch){var l=R(u,u.length,e.options.tabSize)-u.length;c=et(c.line,Math.max(0,Math.round((o-Sn(e.display).left)/ir(e.display))-l))}return c}function lr(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var n=e.display.view,r=0;rt)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)Dt&&Bt(e.doc,t)i.viewFrom?dr(e):(i.viewFrom+=r,i.viewTo+=r);else if(t<=i.viewFrom&&n>=i.viewTo)dr(e);else if(t<=i.viewFrom){var o=hr(e,n,n+r,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=r):dr(e)}else if(n>=i.viewTo){var a=hr(e,t,t,-1);a?(i.view=i.view.slice(0,a.index),i.viewTo=a.lineN):dr(e)}else{var s=hr(e,t,t,-1),u=hr(e,n,n+r,1);s&&u?(i.view=i.view.slice(0,s.index).concat(on(e,s.lineN,u.lineN)).concat(i.view.slice(u.index)),i.viewTo+=r):dr(e)}var c=i.externalMeasured;c&&(n=i.lineN&&t=r.viewTo)){var o=r.view[lr(e,t)];if(null!=o.node){var a=o.changes||(o.changes=[]);-1==U(a,n)&&a.push(n)}}}function dr(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function hr(e,t,n,r){var i,o=lr(e,t),a=e.display.view;if(!Dt||n==e.doc.first+e.doc.size)return{index:o,lineN:n};for(var s=e.display.viewFrom,u=0;u0){if(o==a.length-1)return null;i=s+a[o].size-t,o++}else i=s-t;t+=i,n+=i}for(;Bt(e.doc,n)!=n;){if(o==(r<0?0:a.length-1))return null;n+=r*a[o-(r<0?1:0)].size,o+=r}return{index:o,lineN:n}}function mr(e){for(var t=e.display.view,n=0,r=0;r=e.display.viewTo||s.to().linet||t==n&&a.to==t)&&(r(Math.max(a.from,t),Math.min(a.to,n),1==a.level?"rtl":"ltr",o),i=!0)}i||r(t,n,"ltr")}(m,n||0,null==r?f:r,(function(e,t,i,p){var g="ltr"==i,y=d(e,g?"left":"right"),v=d(t-1,g?"right":"left"),b=null==n&&0==e,E=null==r&&t==f,x=0==p,D=!m||p==m.length-1;if(v.top-y.top<=3){var C=(c?E:b)&&D,w=(c?b:E)&&x?s:(g?y:v).left,S=C?u:(g?v:y).right;l(w,y.top,S-w,y.bottom)}else{var _,k,A,T;g?(_=c&&b&&x?s:y.left,k=c?u:h(e,i,"before"),A=c?s:h(t,i,"after"),T=c&&E&&D?u:v.right):(_=c?h(e,i,"before"):s,k=!c&&b&&x?u:y.right,A=!c&&E&&D?s:v.left,T=c?h(t,i,"after"):u),l(_,y.top,k-_,y.bottom),y.bottom0?t.blinker=setInterval((function(){e.hasFocus()||Sr(e),t.cursorDiv.style.visibility=(n=!n)?"":"hidden"}),e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function Dr(e){e.state.focused||(e.display.input.focus(),wr(e))}function Cr(e){e.state.delayingBlurEvent=!0,setTimeout((function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,Sr(e))}),100)}function wr(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(he(e,"focus",e,t),e.state.focused=!0,I(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),u&&setTimeout((function(){return e.display.input.reset(!0)}),20)),e.display.input.receivedFocus()),xr(e))}function Sr(e,t){e.state.delayingBlurEvent||(e.state.focused&&(he(e,"blur",e,t),e.state.focused=!1,_(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout((function(){e.state.focused||(e.display.shift=!1)}),150))}function _r(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=0;r.005||f<-.005)&&(Qe(i.line,u),kr(i.line),i.rest))for(var d=0;de.display.sizerWidth){var h=Math.ceil(c/ir(e.display));h>e.display.maxLineLength&&(e.display.maxLineLength=h,e.display.maxLine=i.line,e.display.maxLineChanged=!0)}}}}function kr(e){if(e.widgets)for(var t=0;t=a&&(o=$e(t,qt(Ge(t,u))-e.wrapper.clientHeight),a=u)}return{from:o,to:Math.max(a,o+1)}}function Tr(e,t){var n=e.display,r=rr(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:n.scroller.scrollTop,o=An(e),a={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+wn(n),u=t.tops-r;if(t.topi+o){var l=Math.min(t.top,(c?s:t.bottom)-o);l!=i&&(a.scrollTop=l)}var p=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:n.scroller.scrollLeft,f=kn(e)-(e.options.fixedGutter?n.gutters.offsetWidth:0),d=t.right-t.left>f;return d&&(t.right=t.left+f),t.left<10?a.scrollLeft=0:t.leftf+p-3&&(a.scrollLeft=t.right+(d?0:10)-f),a}function Or(e,t){null!=t&&(Ir(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Fr(e){Ir(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Nr(e,t,n){null==t&&null==n||Ir(e),null!=t&&(e.curOp.scrollLeft=t),null!=n&&(e.curOp.scrollTop=n)}function Ir(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Mr(e,Jn(e,t.from),Jn(e,t.to),t.margin))}function Mr(e,t,n,r){var i=Tr(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});Nr(e,i.scrollLeft,i.scrollTop)}function jr(e,t){Math.abs(e.doc.scrollTop-t)<2||(n||ui(e,{top:t}),Lr(e,t,!0),n&&ui(e),ri(e,100))}function Lr(e,t,n){t=Math.max(0,Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t)),(e.display.scroller.scrollTop!=t||n)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Pr(e,t,n,r){t=Math.max(0,Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth)),(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r||(e.doc.scrollLeft=t,pi(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function Rr(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+wn(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+_n(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}var Br=function(e,t,n){this.cm=n;var r=this.vert=T("div",[T("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=T("div",[T("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");r.tabIndex=i.tabIndex=-1,e(r),e(i),pe(r,"scroll",(function(){r.clientHeight&&t(r.scrollTop,"vertical")})),pe(i,"scroll",(function(){i.clientWidth&&t(i.scrollLeft,"horizontal")})),this.checkedZeroWidth=!1,a&&s<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};Br.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,n=e.scrollHeight>e.clientHeight+1,r=e.nativeBarWidth;if(n){this.vert.style.display="block",this.vert.style.bottom=t?r+"px":"0";var i=e.viewHeight-(t?r:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=n?r+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(n?r:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==r&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:n?r:0,bottom:t?r:0}},Br.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},Br.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},Br.prototype.zeroWidthHack=function(){var e=v&&!d?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new B,this.disableVert=new B},Br.prototype.enableZeroWidthBar=function(e,t,n){e.style.pointerEvents="auto",t.set(1e3,(function r(){var i=e.getBoundingClientRect();("vert"==n?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents="none":t.set(1e3,r)}))},Br.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var Ur=function(){};function zr(e,t){t||(t=Rr(e));var n=e.display.barWidth,r=e.display.barHeight;Vr(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&_r(e),Vr(e,Rr(e)),n=e.display.barWidth,r=e.display.barHeight}function Vr(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}Ur.prototype.update=function(){return{bottom:0,right:0}},Ur.prototype.setScrollLeft=function(){},Ur.prototype.setScrollTop=function(){},Ur.prototype.clear=function(){};var qr={native:Br,null:Ur};function Hr(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&_(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new qr[e.options.scrollbarStyle]((function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),pe(t,"mousedown",(function(){e.state.focused&&setTimeout((function(){return e.display.input.focus()}),0)})),t.setAttribute("cm-not-content","true")}),(function(t,n){"horizontal"==n?Pr(e,t):jr(e,t)}),e),e.display.scrollbars.addClass&&I(e.display.wrapper,e.display.scrollbars.addClass)}var Wr=0;function Gr(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Wr},t=e.curOp,an?an.ops.push(t):t.ownsGroup=an={ops:[t],delayedCallbacks:[]}}function Kr(e){var t=e.curOp;t&&function(e,t){var n=e.ownsGroup;if(n)try{!function(e){var t=e.delayedCallbacks,n=0;do{for(;n=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new oi(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Qr(e){e.updatedDisplay=e.mustUpdate&&ai(e.cm,e.update)}function Yr(e){var t=e.cm,n=t.display;e.updatedDisplay&&_r(t),e.barMeasure=Rr(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=On(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+_n(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-kn(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}function $r(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!h){var o=T("div","​",null,"position: absolute;\n top: "+(t.top-n.viewOffset-Cn(e.display))+"px;\n height: "+(t.bottom-t.top+_n(e)+n.barHeight)+"px;\n left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}(t,function(e,t,n,r){var i;null==r&&(r=0),e.options.lineWrapping||t!=n||(n="before"==(t=t.ch?et(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?et(t.line,t.ch+1,"before"):t);for(var o=0;o<5;o++){var a=!1,s=Kn(e,t),u=n&&n!=t?Kn(e,n):s,c=Tr(e,i={left:Math.min(s.left,u.left),top:Math.min(s.top,u.top)-r,right:Math.max(s.left,u.left),bottom:Math.max(s.bottom,u.bottom)+r}),l=e.doc.scrollTop,p=e.doc.scrollLeft;if(null!=c.scrollTop&&(jr(e,c.scrollTop),Math.abs(e.doc.scrollTop-l)>1&&(a=!0)),null!=c.scrollLeft&&(Pr(e,c.scrollLeft),Math.abs(e.doc.scrollLeft-p)>1&&(a=!0)),!a)break}return i}(t,st(r,e.scrollToPos.from),st(r,e.scrollToPos.to),e.scrollToPos.margin));var i=e.maybeHiddenMarkers,o=e.maybeUnhiddenMarkers;if(i)for(var a=0;a=e.display.viewTo)){var n=+new Date+e.options.workTime,r=dt(e,t.highlightFrontier),i=[];t.iter(r.line,Math.min(t.first+t.size,e.display.viewTo+500),(function(o){if(r.line>=e.display.viewFrom){var a=o.styles,s=o.text.length>e.options.maxHighlightLength?Ve(t.mode,r.state):null,u=pt(e,o,r,!0);s&&(r.state=s),o.styles=u.styles;var c=o.styleClasses,l=u.classes;l?o.styleClasses=l:c&&(o.styleClasses=null);for(var p=!a||a.length!=o.styles.length||c!=l&&(!c||!l||c.bgClass!=l.bgClass||c.textClass!=l.textClass),f=0;!p&&fn)return ri(e,e.options.workDelay),!0})),t.highlightFrontier=r.line,t.modeFrontier=Math.max(t.modeFrontier,r.line),i.length&&Zr(e,(function(){for(var t=0;t=n.viewFrom&&t.visible.to<=n.viewTo&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&0==mr(e))return!1;fi(e)&&(dr(e),t.dims=or(e));var i=r.first+r.size,o=Math.max(t.visible.from-e.options.viewportMargin,r.first),a=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFroma&&n.viewTo-a<20&&(a=Math.min(i,n.viewTo)),Dt&&(o=Bt(e.doc,o),a=Ut(e.doc,a));var s=o!=n.viewFrom||a!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;!function(e,t,n){var r=e.display;0==r.view.length||t>=r.viewTo||n<=r.viewFrom?(r.view=on(e,t,n),r.viewFrom=t):(r.viewFrom>t?r.view=on(e,t,r.viewFrom).concat(r.view):r.viewFromn&&(r.view=r.view.slice(0,lr(e,n)))),r.viewTo=n}(e,o,a),n.viewOffset=qt(Ge(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var c=mr(e);if(!s&&0==c&&!t.force&&n.renderedView==n.view&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo))return!1;var l=function(e){if(e.hasFocus())return null;var t=N();if(!t||!F(e.display.lineDiv,t))return null;var n={activeElt:t};if(window.getSelection){var r=window.getSelection();r.anchorNode&&r.extend&&F(e.display.lineDiv,r.anchorNode)&&(n.anchorNode=r.anchorNode,n.anchorOffset=r.anchorOffset,n.focusNode=r.focusNode,n.focusOffset=r.focusOffset)}return n}(e);return c>4&&(n.lineDiv.style.display="none"),function(e,t,n){var r=e.display,i=e.options.lineNumbers,o=r.lineDiv,a=o.firstChild;function s(t){var n=t.nextSibling;return u&&v&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),n}for(var c=r.view,l=r.viewFrom,p=0;p-1&&(d=!1),ln(e,f,l,n)),d&&(k(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(Ze(e.options,l)))),a=f.node.nextSibling}else{var h=yn(e,f,l,n);o.insertBefore(h,a)}l+=f.size}for(;a;)a=s(a)}(e,n.updateLineNumbers,t.dims),c>4&&(n.lineDiv.style.display=""),n.renderedView=n.view,function(e){if(e&&e.activeElt&&e.activeElt!=N()&&(e.activeElt.focus(),!/^(INPUT|TEXTAREA)$/.test(e.activeElt.nodeName)&&e.anchorNode&&F(document.body,e.anchorNode)&&F(document.body,e.focusNode))){var t=window.getSelection(),n=document.createRange();n.setEnd(e.anchorNode,e.anchorOffset),n.collapse(!1),t.removeAllRanges(),t.addRange(n),t.extend(e.focusNode,e.focusOffset)}}(l),k(n.cursorDiv),k(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,s&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,ri(e,400)),n.updateLineNumbers=null,!0}function si(e,t){for(var n=t.viewport,r=!0;;r=!1){if(r&&e.options.lineWrapping&&t.oldDisplayWidth!=kn(e))r&&(t.visible=Ar(e.display,e.doc,n));else if(n&&null!=n.top&&(n={top:Math.min(e.doc.height+wn(e.display)-An(e),n.top)}),t.visible=Ar(e.display,e.doc,n),t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)break;if(!ai(e,t))break;_r(e);var i=Rr(e);gr(e),zr(e,i),li(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function ui(e,t){var n=new oi(e,t);if(ai(e,n)){_r(e),si(e,n);var r=Rr(e);gr(e),zr(e,r),li(e,r),n.finish()}}function ci(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+"px"}function li(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+_n(e)+"px"}function pi(e){var t=e.display,n=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var r=ar(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=r+"px",a=0;as.clientWidth,l=s.scrollHeight>s.clientHeight;if(i&&c||o&&l){if(o&&v&&u)e:for(var f=t.target,d=a.view;f!=s;f=f.parentNode)for(var h=0;h=0&&tt(e,r.to())<=0)return n}return-1};var Ci=function(e,t){this.anchor=e,this.head=t};function wi(e,t,n){var r=e&&e.options.selectionsMayTouch,i=t[n];t.sort((function(e,t){return tt(e.from(),t.from())})),n=U(t,i);for(var o=1;o0:u>=0){var c=ot(s.from(),a.from()),l=it(s.to(),a.to()),p=s.empty()?a.from()==a.head:s.from()==s.head;o<=n&&--n,t.splice(--o,2,new Ci(p?l:c,p?c:l))}}return new Di(t,n)}function Si(e,t){return new Di([new Ci(e,t||e)],0)}function _i(e){return e.text?et(e.from.line+e.text.length-1,J(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function ki(e,t){if(tt(e,t.from)<0)return e;if(tt(e,t.to)<=0)return _i(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=_i(t).ch-t.to.ch),et(n,r)}function Ai(e,t){for(var n=[],r=0;r1&&e.remove(s.line+1,h-1),e.insert(s.line+1,y)}un(e,"change",e,t)}function Mi(e,t,n){!function e(r,i,o){if(r.linked)for(var a=0;as-(e.cm?e.cm.options.historyEventDelay:500)||"*"==t.origin.charAt(0)))&&(o=function(e,t){return t?(Bi(e.done),J(e.done)):e.done.length&&!J(e.done).ranges?J(e.done):e.done.length>1&&!e.done[e.done.length-2].ranges?(e.done.pop(),J(e.done)):void 0}(i,i.lastOp==r)))a=J(o.changes),0==tt(t.from,t.to)&&0==tt(t.from,a.to)?a.to=_i(t):o.changes.push(Ri(e,t));else{var u=J(i.done);for(u&&u.ranges||Vi(e.sel,i.done),o={changes:[Ri(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=s,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,a||he(e,"historyAdded")}function zi(e,t,n,r){var i=e.history,o=r&&r.origin;n==i.lastSelOp||o&&i.lastSelOrigin==o&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==o||function(e,t,n,r){var i=t.charAt(0);return"*"==i||"+"==i&&n.ranges.length==r.ranges.length&&n.somethingSelected()==r.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}(e,o,J(i.done),t))?i.done[i.done.length-1]=t:Vi(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=o,i.lastSelOp=n,r&&!1!==r.clearRedo&&Bi(i.undone)}function Vi(e,t){var n=J(t);n&&n.ranges&&n.equals(e)||t.push(e)}function qi(e,t,n,r){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,n),Math.min(e.first+e.size,r),(function(n){n.markedSpans&&((i||(i=t["spans_"+e.id]={}))[o]=n.markedSpans),++o}))}function Hi(e){if(!e)return null;for(var t,n=0;n-1&&(J(s)[p]=c[p],delete c[p])}}}return r}function Ki(e,t,n,r){if(r){var i=e.anchor;if(n){var o=tt(t,i)<0;o!=tt(n,i)<0?(i=t,t=n):o!=tt(t,n)<0&&(t=n)}return new Ci(i,t)}return new Ci(n||t,t)}function Ji(e,t,n,r,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),Zi(e,new Di([Ki(e.sel.primary(),t,n,i)],0),r)}function Qi(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o=t.ch:s.to>t.ch))){if(i&&(he(u,"beforeCursorEnter"),u.explicitlyCleared)){if(o.markedSpans){--a;continue}break}if(!u.atomic)continue;if(n){var p=u.find(r<0?1:-1),f=void 0;if((r<0?l:c)&&(p=ao(e,p,-r,p&&p.line==t.line?o:null)),p&&p.line==t.line&&(f=tt(p,n))&&(r<0?f<0:f>0))return io(e,p,t,r,i)}var d=u.find(r<0?-1:1);return(r<0?c:l)&&(d=ao(e,d,r,d.line==t.line?o:null)),d?io(e,d,t,r,i):null}}return t}function oo(e,t,n,r,i){var o=r||1,a=io(e,t,n,o,i)||!i&&io(e,t,n,o,!0)||io(e,t,n,-o,i)||!i&&io(e,t,n,-o,!0);return a||(e.cantEdit=!0,et(e.first,0))}function ao(e,t,n,r){return n<0&&0==t.ch?t.line>e.first?st(e,et(t.line-1)):null:n>0&&t.ch==(r||Ge(e,t.line)).text.length?t.line0)){var l=[u,1],p=tt(c.from,s.from),f=tt(c.to,s.to);(p<0||!a.inclusiveLeft&&!p)&&l.push({from:c.from,to:s.from}),(f>0||!a.inclusiveRight&&!f)&&l.push({from:s.to,to:c.to}),i.splice.apply(i,l),u+=l.length-3}}return i}(e,t.from,t.to);if(r)for(var i=r.length-1;i>=0;--i)lo(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else lo(e,t)}}function lo(e,t){if(1!=t.text.length||""!=t.text[0]||0!=tt(t.from,t.to)){var n=Ai(e,t);Ui(e,t,n,e.cm?e.cm.curOp.id:NaN),ho(e,t,n,_t(e,t));var r=[];Mi(e,(function(e,n){n||-1!=U(r,e.history)||(vo(e.history,t),r.push(e.history)),ho(e,t,null,_t(e,t))}))}}function po(e,t,n){var r=e.cm&&e.cm.state.suppressEdits;if(!r||n){for(var i,o=e.history,a=e.sel,s="undo"==t?o.done:o.undone,u="undo"==t?o.undone:o.done,c=0;c=0;--d){var h=f(d);if(h)return h.v}}}}function fo(e,t){if(0!=t&&(e.first+=t,e.sel=new Di(Q(e.sel.ranges,(function(e){return new Ci(et(e.anchor.line+t,e.anchor.ch),et(e.head.line+t,e.head.ch))})),e.sel.primIndex),e.cm)){pr(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;re.lastLine())){if(t.from.lineo&&(t={from:t.from,to:et(o,Ge(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Ke(e,t.from,t.to),n||(n=Ai(e,t)),e.cm?function(e,t,n){var r=e.doc,i=e.display,o=t.from,a=t.to,s=!1,u=o.line;e.options.lineWrapping||(u=Ye(Rt(Ge(r,o.line))),r.iter(u,a.line+1,(function(e){if(e==i.maxLine)return s=!0,!0}))),r.sel.contains(t.from,t.to)>-1&&ge(e),Ii(r,t,n,sr(e)),e.options.lineWrapping||(r.iter(u,o.line+t.text.length,(function(e){var t=Ht(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)})),s&&(e.curOp.updateMaxLine=!0)),function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontiern;r--){var i=Ge(e,r).stateAfter;if(i&&(!(i instanceof ct)||r+i.lookAhead1||!(this.children[0]instanceof Eo))){var s=[];this.collapse(s),this.children=[new Eo(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t50){for(var a=i.lines.length%25+25,s=a;s10);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;r0||0==a&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=O("span",[o.replacedWith],"CodeMirror-widget"),r.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),r.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(Pt(e,t.line,t,n,o)||t.line!=n.line&&Pt(e,n.line,t,n,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Dt=!0}o.addToHistory&&Ui(e,{from:t,to:n,origin:"markText"},e.sel,NaN);var s,u=t.line,c=e.cm;if(e.iter(u,n.line+1,(function(e){c&&o.collapsed&&!c.options.lineWrapping&&Rt(e)==c.display.maxLine&&(s=!0),o.collapsed&&u!=t.line&&Qe(e,0),function(e,t){e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],t.marker.attachLine(e)}(e,new Ct(o,u==t.line?t.ch:null,u==n.line?n.ch:null)),++u})),o.collapsed&&e.iter(t.line,n.line+1,(function(t){zt(e,t)&&Qe(t,0)})),o.clearOnEnter&&pe(o,"beforeCursorEnter",(function(){return o.clear()})),o.readOnly&&(xt=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++wo,o.atomic=!0),c){if(s&&(c.curOp.updateMaxLine=!0),o.collapsed)pr(c,t.line,n.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var l=t.line;l<=n.line;l++)fr(c,l,"text");o.atomic&&no(c.doc),un(c,"markerAdded",c,o)}return o}So.prototype.clear=function(){if(!this.explicitlyCleared){var e=this.doc.cm,t=e&&!e.curOp;if(t&&Gr(e),ye(this,"clear")){var n=this.find();n&&un(this,"clear",n.from,n.to)}for(var r=null,i=null,o=0;oe.display.maxLineLength&&(e.display.maxLine=c,e.display.maxLineLength=l,e.display.maxLineChanged=!0)}null!=r&&e&&this.collapsed&&pr(e,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&no(e.doc)),e&&un(e,"markerCleared",e,this,r,i),t&&Kr(e),this.parent&&this.parent.clear()}},So.prototype.find=function(e,t){var n,r;null==e&&"bookmark"==this.type&&(e=1);for(var i=0;i=0;u--)co(this,r[u]);s?Xi(this,s):this.cm&&Fr(this.cm)})),undo:ni((function(){po(this,"undo")})),redo:ni((function(){po(this,"redo")})),undoSelection:ni((function(){po(this,"undo",!0)})),redoSelection:ni((function(){po(this,"redo",!0)})),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,n){e=st(this,e),t=st(this,t);var r=[],i=e.line;return this.iter(e.line,t.line+1,(function(o){var a=o.markedSpans;if(a)for(var s=0;s=u.to||null==u.from&&i!=e.line||null!=u.from&&i==t.line&&u.from>=t.ch||n&&!n(u.marker)||r.push(u.marker.parent||u.marker)}++i})),r},getAllMarks:function(){var e=[];return this.iter((function(t){var n=t.markedSpans;if(n)for(var r=0;re)return t=e,!0;e-=o,++n})),st(this,et(n,t))},indexFromPos:function(e){var t=(e=st(this,e)).ch;if(e.linet&&(t=e.from),null!=e.to&&e.to-1)return t.state.draggingText(e),void setTimeout((function(){return t.display.input.focus()}),20);try{var p=e.dataTransfer.getData("Text");if(p){var f;if(t.state.draggingText&&!t.state.draggingText.copy&&(f=t.listSelections()),eo(t.doc,Si(n,n)),f)for(var d=0;d=0;t--)mo(e.doc,"",r[t].from,r[t].to,"+delete");Fr(e)}))}function Xo(e,t,n){var r=ie(e.text,t+n,n);return r<0||r>e.text.length?null:r}function Zo(e,t,n){var r=Xo(e,t.ch,n);return null==r?null:new et(t.line,r,n<0?"after":"before")}function ea(e,t,n,r,i){if(e){"rtl"==t.doc.direction&&(i=-i);var o=ce(n,t.doc.direction);if(o){var a,s=i<0?J(o):o[0],u=i<0==(1==s.level)?"after":"before";if(s.level>0||"rtl"==t.doc.direction){var c=Nn(t,n);a=i<0?n.text.length-1:0;var l=In(t,c,a).top;a=oe((function(e){return In(t,c,e).top==l}),i<0==(1==s.level)?s.from:s.to-1,a),"before"==u&&(a=Xo(n,a,1))}else a=i<0?s.to:s.from;return new et(r,a,u)}}return new et(r,i<0?n.text.length:0,i<0?"before":"after")}qo.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},qo.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},qo.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},qo.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},qo.default=v?qo.macDefault:qo.pcDefault;var ta={selectAll:so,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),V)},killLine:function(e){return $o(e,(function(t){if(t.empty()){var n=Ge(e.doc,t.head.line).text.length;return t.head.ch==n&&t.head.line0)i=new et(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),et(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var a=Ge(e.doc,i.line-1).text;a&&(i=new et(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+a.charAt(a.length-1),et(i.line-1,a.length-1),i,"+transpose"))}n.push(new Ci(i,i))}e.setSelections(n)}))},newlineAndIndent:function(e){return Zr(e,(function(){for(var t=e.listSelections(),n=t.length-1;n>=0;n--)e.replaceRange(e.doc.lineSeparator(),t[n].anchor,t[n].head,"+input");t=e.listSelections();for(var r=0;r-1&&(tt((i=c.ranges[i]).from(),t)<0||t.xRel>0)&&(tt(i.to(),t)>0||t.xRel<0)?function(e,t,n,r){var i=e.display,o=!1,c=ei(e,(function(t){u&&(i.scroller.draggable=!1),e.state.draggingText=!1,de(i.wrapper.ownerDocument,"mouseup",c),de(i.wrapper.ownerDocument,"mousemove",l),de(i.scroller,"dragstart",p),de(i.scroller,"drop",c),o||(be(t),r.addNew||Ji(e.doc,n,null,null,r.extend),u&&!f||a&&9==s?setTimeout((function(){i.wrapper.ownerDocument.body.focus({preventScroll:!0}),i.input.focus()}),20):i.input.focus())})),l=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},p=function(){return o=!0};u&&(i.scroller.draggable=!0),e.state.draggingText=c,c.copy=!r.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop(),pe(i.wrapper.ownerDocument,"mouseup",c),pe(i.wrapper.ownerDocument,"mousemove",l),pe(i.scroller,"dragstart",p),pe(i.scroller,"drop",c),Cr(e),setTimeout((function(){return i.input.focus()}),20)}(e,r,t,o):function(e,t,n,r){var i=e.display,o=e.doc;be(t);var a,s,u=o.sel,c=u.ranges;if(r.addNew&&!r.extend?(s=o.sel.contains(n),a=s>-1?c[s]:new Ci(n,n)):(a=o.sel.primary(),s=o.sel.primIndex),"rectangle"==r.unit)r.addNew||(a=new Ci(n,n)),n=cr(e,t,!0,!0),s=-1;else{var l=ya(e,n,r.unit);a=r.extend?Ki(a,l.anchor,l.head,r.extend):l}r.addNew?-1==s?(s=c.length,Zi(o,wi(e,c.concat([a]),s),{scroll:!1,origin:"*mouse"})):c.length>1&&c[s].empty()&&"char"==r.unit&&!r.extend?(Zi(o,wi(e,c.slice(0,s).concat(c.slice(s+1)),0),{scroll:!1,origin:"*mouse"}),u=o.sel):Yi(o,s,a,q):(s=0,Zi(o,new Di([a],0),q),u=o.sel);var p=n;function f(t){if(0!=tt(p,t))if(p=t,"rectangle"==r.unit){for(var i=[],c=e.options.tabSize,l=R(Ge(o,n.line).text,n.ch,c),f=R(Ge(o,t.line).text,t.ch,c),d=Math.min(l,f),h=Math.max(l,f),m=Math.min(n.line,t.line),g=Math.min(e.lastLine(),Math.max(n.line,t.line));m<=g;m++){var y=Ge(o,m).text,v=W(y,d,c);d==h?i.push(new Ci(et(m,v),et(m,v))):y.length>v&&i.push(new Ci(et(m,v),et(m,W(y,h,c))))}i.length||i.push(new Ci(n,n)),Zi(o,wi(e,u.ranges.slice(0,s).concat(i),s),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var b,E=a,x=ya(e,t,r.unit),D=E.anchor;tt(x.anchor,D)>0?(b=x.head,D=ot(E.from(),x.anchor)):(b=x.anchor,D=it(E.to(),x.head));var C=u.ranges.slice(0);C[s]=function(e,t){var n=t.anchor,r=t.head,i=Ge(e.doc,n.line);if(0==tt(n,r)&&n.sticky==r.sticky)return t;var o=ce(i);if(!o)return t;var a=se(o,n.ch,n.sticky),s=o[a];if(s.from!=n.ch&&s.to!=n.ch)return t;var u,c=a+(s.from==n.ch==(1!=s.level)?0:1);if(0==c||c==o.length)return t;if(r.line!=n.line)u=(r.line-n.line)*("ltr"==e.doc.direction?1:-1)>0;else{var l=se(o,r.ch,r.sticky),p=l-a||(r.ch-n.ch)*(1==s.level?-1:1);u=l==c-1||l==c?p<0:p>0}var f=o[c+(u?-1:0)],d=u==(1==f.level),h=d?f.from:f.to,m=d?"after":"before";return n.ch==h&&n.sticky==m?t:new Ci(new et(n.line,h,m),r)}(e,new Ci(st(o,D),b)),Zi(o,wi(e,C,s),q)}}var d=i.wrapper.getBoundingClientRect(),h=0;function m(t){e.state.selectingText=!1,h=1/0,t&&(be(t),i.input.focus()),de(i.wrapper.ownerDocument,"mousemove",g),de(i.wrapper.ownerDocument,"mouseup",y),o.history.lastSelOrigin=null}var g=ei(e,(function(t){0!==t.buttons&&we(t)?function t(n){var a=++h,s=cr(e,n,!0,"rectangle"==r.unit);if(s)if(0!=tt(s,p)){e.curOp.focus=N(),f(s);var u=Ar(i,o);(s.line>=u.to||s.lined.bottom?20:0;c&&setTimeout(ei(e,(function(){h==a&&(i.scroller.scrollTop+=c,t(n))})),50)}}(t):m(t)})),y=ei(e,m);e.state.selectingText=y,pe(i.wrapper.ownerDocument,"mousemove",g),pe(i.wrapper.ownerDocument,"mouseup",y)}(e,r,t,o)}(t,r,o,e):Ce(e)==n.scroller&&be(e):2==i?(r&&Ji(t.doc,r),setTimeout((function(){return n.input.focus()}),20)):3==i&&(C?t.display.input.onContextMenu(e):Cr(t)))}}function ya(e,t,n){if("char"==n)return new Ci(t,t);if("word"==n)return e.findWordAt(t);if("line"==n)return new Ci(et(t.line,0),st(e.doc,et(t.line+1,0)));var r=n(e,t);return new Ci(r.from,r.to)}function va(e,t,n,r){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(e){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&be(t);var a=e.display,s=a.lineDiv.getBoundingClientRect();if(o>s.bottom||!ye(e,n))return xe(t);o-=s.top-a.viewOffset;for(var u=0;u=i)return he(e,n,e,$e(e.doc,o),e.display.gutterSpecs[u].className,t),xe(t)}}function ba(e,t){return va(e,t,"gutterClick",!0)}function Ea(e,t){Dn(e.display,t)||function(e,t){return!!ye(e,"gutterContextMenu")&&va(e,t,"gutterContextMenu",!1)}(e,t)||me(e,t,"contextmenu")||C||e.display.input.onContextMenu(t)}function xa(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),Un(e)}ma.prototype.compare=function(e,t,n){return this.time+400>e&&0==tt(t,this.pos)&&n==this.button};var Da={toString:function(){return"CodeMirror.Init"}},Ca={},wa={};function Sa(e,t,n){if(!t!=!(n&&n!=Da)){var r=e.display.dragFunctions,i=t?pe:de;i(e.display.scroller,"dragstart",r.start),i(e.display.scroller,"dragenter",r.enter),i(e.display.scroller,"dragover",r.over),i(e.display.scroller,"dragleave",r.leave),i(e.display.scroller,"drop",r.drop)}}function _a(e){e.options.lineWrapping?(I(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(_(e.display.wrapper,"CodeMirror-wrap"),Wt(e)),ur(e),pr(e),Un(e),setTimeout((function(){return zr(e)}),100)}function ka(e,t){var n=this;if(!(this instanceof ka))return new ka(e,t);this.options=t=t?P(t):{},P(Ca,t,!1);var r=t.value;"string"==typeof r?r=new Fo(r,t.mode,null,t.lineSeparator,t.direction):t.mode&&(r.modeOption=t.mode),this.doc=r;var i=new ka.inputStyles[t.inputStyle](this),o=this.display=new gi(e,r,i,t);for(var c in o.wrapper.CodeMirror=this,xa(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),Hr(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new B,keySeq:null,specialChars:null},t.autofocus&&!y&&o.input.focus(),a&&s<11&&setTimeout((function(){return n.display.input.reset(!0)}),20),function(e){var t=e.display;pe(t.scroller,"mousedown",ei(e,ga)),pe(t.scroller,"dblclick",a&&s<11?ei(e,(function(t){if(!me(e,t)){var n=cr(e,t);if(n&&!ba(e,t)&&!Dn(e.display,t)){be(t);var r=e.findWordAt(n);Ji(e.doc,r.anchor,r.head)}}})):function(t){return me(e,t)||be(t)}),pe(t.scroller,"contextmenu",(function(t){return Ea(e,t)})),pe(t.input.getField(),"contextmenu",(function(n){t.scroller.contains(n.target)||Ea(e,n)}));var n,r={end:0};function i(){t.activeTouch&&(n=setTimeout((function(){return t.activeTouch=null}),1e3),(r=t.activeTouch).end=+new Date)}function o(e,t){if(null==t.left)return!0;var n=t.left-e.left,r=t.top-e.top;return n*n+r*r>400}pe(t.scroller,"touchstart",(function(i){if(!me(e,i)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(i)&&!ba(e,i)){t.input.ensurePolled(),clearTimeout(n);var o=+new Date;t.activeTouch={start:o,moved:!1,prev:o-r.end<=300?r:null},1==i.touches.length&&(t.activeTouch.left=i.touches[0].pageX,t.activeTouch.top=i.touches[0].pageY)}})),pe(t.scroller,"touchmove",(function(){t.activeTouch&&(t.activeTouch.moved=!0)})),pe(t.scroller,"touchend",(function(n){var r=t.activeTouch;if(r&&!Dn(t,n)&&null!=r.left&&!r.moved&&new Date-r.start<300){var a,s=e.coordsChar(t.activeTouch,"page");a=!r.prev||o(r,r.prev)?new Ci(s,s):!r.prev.prev||o(r,r.prev.prev)?e.findWordAt(s):new Ci(et(s.line,0),st(e.doc,et(s.line+1,0))),e.setSelection(a.anchor,a.head),e.focus(),be(n)}i()})),pe(t.scroller,"touchcancel",i),pe(t.scroller,"scroll",(function(){t.scroller.clientHeight&&(jr(e,t.scroller.scrollTop),Pr(e,t.scroller.scrollLeft,!0),he(e,"scroll",e))})),pe(t.scroller,"mousewheel",(function(t){return xi(e,t)})),pe(t.scroller,"DOMMouseScroll",(function(t){return xi(e,t)})),pe(t.wrapper,"scroll",(function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0})),t.dragFunctions={enter:function(t){me(e,t)||De(t)},over:function(t){me(e,t)||(function(e,t){var n=cr(e,t);if(n){var r=document.createDocumentFragment();vr(e,n,r),e.display.dragCursor||(e.display.dragCursor=T("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),A(e.display.dragCursor,r)}}(e,t),De(t))},start:function(t){return function(e,t){if(a&&(!e.state.draggingText||+new Date-No<100))De(t);else if(!me(e,t)&&!Dn(e.display,t)&&(t.dataTransfer.setData("Text",e.getSelection()),t.dataTransfer.effectAllowed="copyMove",t.dataTransfer.setDragImage&&!f)){var n=T("img",null,null,"position: fixed; left: 0; top: 0;");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",p&&(n.width=n.height=1,e.display.wrapper.appendChild(n),n._top=n.offsetTop),t.dataTransfer.setDragImage(n,0,0),p&&n.parentNode.removeChild(n)}}(e,t)},drop:ei(e,Io),leave:function(t){me(e,t)||Mo(e)}};var u=t.input.getField();pe(u,"keyup",(function(t){return pa.call(e,t)})),pe(u,"keydown",ei(e,la)),pe(u,"keypress",ei(e,fa)),pe(u,"focus",(function(t){return wr(e,t)})),pe(u,"blur",(function(t){return Sr(e,t)}))}(this),Po(),Gr(this),this.curOp.forceUpdate=!0,ji(this,r),t.autofocus&&!y||this.hasFocus()?setTimeout((function(){n.hasFocus()&&!n.state.focused&&wr(n)}),20):Sr(this),wa)wa.hasOwnProperty(c)&&wa[c](this,t[c],Da);fi(this),t.finishInit&&t.finishInit(this);for(var l=0;l150)){if(!r)return;n="prev"}}else c=0,n="not";"prev"==n?c=t>o.first?R(Ge(o,t-1).text,null,a):0:"add"==n?c=u+e.options.indentUnit:"subtract"==n?c=u-e.options.indentUnit:"number"==typeof n&&(c=u+n),c=Math.max(0,c);var p="",f=0;if(e.options.indentWithTabs)for(var d=Math.floor(c/a);d;--d)f+=a,p+="\t";if(fa,u=Fe(t),c=null;if(s&&r.ranges.length>1)if(Oa&&Oa.text.join("\n")==t){if(r.ranges.length%Oa.text.length==0){c=[];for(var l=0;l=0;f--){var d=r.ranges[f],h=d.from(),m=d.to();d.empty()&&(n&&n>0?h=et(h.line,h.ch-n):e.state.overwrite&&!s?m=et(m.line,Math.min(Ge(o,m.line).text.length,m.ch+J(u).length)):s&&Oa&&Oa.lineWise&&Oa.text.join("\n")==u.join("\n")&&(h=m=et(h.line,0)));var g={from:h,to:m,text:c?c[f%c.length]:u,origin:i||(s?"paste":e.state.cutIncoming>a?"cut":"+input")};co(e.doc,g),un(e,"inputRead",e,g)}t&&!s&&Ma(e,t),Fr(e),e.curOp.updateInput<2&&(e.curOp.updateInput=p),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function Ia(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");if(n)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||Zr(t,(function(){return Na(t,n,0,null,"paste")})),!0}function Ma(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var n=e.doc.sel,r=n.ranges.length-1;r>=0;r--){var i=n.ranges[r];if(!(i.head.ch>100||r&&n.ranges[r-1].head.line==i.head.line)){var o=e.getModeAt(i.head),a=!1;if(o.electricChars){for(var s=0;s-1){a=Ta(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(Ge(e.doc,i.head.line).text.slice(0,i.head.ch))&&(a=Ta(e,i.head.line,"smart"));a&&un(e,"electricInput",e,i.head.line)}}}function ja(e){for(var t=[],n=[],r=0;r0?0:-1));a=isNaN(l)?null:new et(t.line,Math.max(0,Math.min(s.text.length,t.ch+n*(l>=55296&&l<56320?2:1))),-n)}else a=i?function(e,t,n,r){var i=ce(t,e.doc.direction);if(!i)return Zo(t,n,r);n.ch>=t.text.length?(n.ch=t.text.length,n.sticky="before"):n.ch<=0&&(n.ch=0,n.sticky="after");var o=se(i,n.ch,n.sticky),a=i[o];if("ltr"==e.doc.direction&&a.level%2==0&&(r>0?a.to>n.ch:a.from=a.from&&f>=l.begin)){var d=p?"before":"after";return new et(n.line,f,d)}}var h=function(e,t,r){for(var o=function(e,t){return t?new et(n.line,u(e,1),"before"):new et(n.line,e,"after")};e>=0&&e0==(1!=a.level),c=s?r.begin:u(r.end,-1);if(a.from<=c&&c0?l.end:u(l.begin,-1);return null==g||r>0&&g==t.text.length||!(m=h(r>0?0:i.length-1,r,c(g)))?null:m}(e.cm,s,t,n):Zo(s,t,n);if(null==a){if(o||(c=t.line+u)=e.first+e.size||(t=new et(c,t.ch,t.sticky),!(s=Ge(e,c))))return!1;t=ea(i,e.cm,s,t.line,u)}else t=a;return!0}if("char"==r||"codepoint"==r)c();else if("column"==r)c(!0);else if("word"==r||"group"==r)for(var l=null,p="group"==r,f=e.cm&&e.cm.getHelper(t,"wordChars"),d=!0;!(n<0)||c(!d);d=!1){var h=s.text.charAt(t.ch)||"\n",m=ee(h,f)?"w":p&&"\n"==h?"n":!p||/\s/.test(h)?null:"p";if(!p||d||m||(m="s"),l&&l!=m){n<0&&(n=1,c(),t.sticky="after");break}if(m&&(l=m),n>0&&!c(!d))break}var g=oo(e,t,o,a,!0);return nt(o,g)&&(g.hitSide=!0),g}function Ba(e,t,n,r){var i,o,a=e.doc,s=t.left;if("page"==r){var u=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),c=Math.max(u-.5*rr(e.display),3);i=(n>0?t.bottom:t.top)+n*c}else"line"==r&&(i=n>0?t.bottom+3:t.top-3);for(;(o=Yn(e,s,i)).outside;){if(n<0?i<=0:i>=a.height){o.hitSide=!0;break}i+=5*n}return o}var Ua=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new B,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function za(e,t){var n=Fn(e,t.line);if(!n||n.hidden)return null;var r=Ge(e.doc,t.line),i=Tn(n,r,t.line),o=ce(r,e.doc.direction),a="left";o&&(a=se(o,t.ch)%2?"right":"left");var s=Ln(i.map,t.ch,a);return s.offset="right"==s.collapse?s.end:s.start,s}function Va(e,t){return t&&(e.bad=!0),e}function qa(e,t,n){var r;if(t==e.display.lineDiv){if(!(r=e.display.lineDiv.childNodes[n]))return Va(e.clipPos(et(e.display.viewTo-1)),!0);t=null,n=0}else for(r=t;;r=r.parentNode){if(!r||r==e.display.lineDiv)return null;if(r.parentNode&&r.parentNode==e.display.lineDiv)break}for(var i=0;i=t.display.viewTo||o.line=t.display.viewFrom&&za(t,i)||{node:u[0].measure.map[2],offset:0},l=o.liner.firstLine()&&(a=et(a.line-1,Ge(r.doc,a.line-1).length)),s.ch==Ge(r.doc,s.line).text.length&&s.linei.viewTo-1)return!1;a.line==i.viewFrom||0==(e=lr(r,a.line))?(t=Ye(i.view[0].line),n=i.view[0].node):(t=Ye(i.view[e].line),n=i.view[e-1].node.nextSibling);var u,c,l=lr(r,s.line);if(l==i.view.length-1?(u=i.viewTo-1,c=i.lineDiv.lastChild):(u=Ye(i.view[l+1].line)-1,c=i.view[l+1].node.previousSibling),!n)return!1;for(var p=r.doc.splitLines(function(e,t,n,r,i){var o="",a=!1,s=e.doc.lineSeparator(),u=!1;function c(){a&&(o+=s,u&&(o+=s),a=u=!1)}function l(e){e&&(c(),o+=e)}function p(t){if(1==t.nodeType){var n=t.getAttribute("cm-text");if(n)return void l(n);var o,f=t.getAttribute("cm-marker");if(f){var d=e.findMarks(et(r,0),et(i+1,0),(g=+f,function(e){return e.id==g}));return void(d.length&&(o=d[0].find(0))&&l(Ke(e.doc,o.from,o.to).join(s)))}if("false"==t.getAttribute("contenteditable"))return;var h=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;h&&c();for(var m=0;m1&&f.length>1;)if(J(p)==J(f))p.pop(),f.pop(),u--;else{if(p[0]!=f[0])break;p.shift(),f.shift(),t++}for(var d=0,h=0,m=p[0],g=f[0],y=Math.min(m.length,g.length);da.ch&&v.charCodeAt(v.length-h-1)==b.charCodeAt(b.length-h-1);)d--,h++;p[p.length-1]=v.slice(0,v.length-h).replace(/^\u200b+/,""),p[0]=p[0].slice(d).replace(/\u200b+$/,"");var x=et(t,d),D=et(u,f.length?J(f).length-h:0);return p.length>1||p[0]||tt(x,D)?(mo(r.doc,p,x,D,"+input"),!0):void 0},Ua.prototype.ensurePolled=function(){this.forceCompositionEnd()},Ua.prototype.reset=function(){this.forceCompositionEnd()},Ua.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Ua.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout((function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()}),80))},Ua.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Zr(this.cm,(function(){return pr(e.cm)}))},Ua.prototype.setUneditable=function(e){e.contentEditable="false"},Ua.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||ei(this.cm,Na)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Ua.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},Ua.prototype.onContextMenu=function(){},Ua.prototype.resetPosition=function(){},Ua.prototype.needsContentAttribute=!0;var Wa=function(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new B,this.hasSelection=!1,this.composing=null};Wa.prototype.init=function(e){var t=this,n=this,r=this.cm;this.createField(e);var i=this.textarea;function o(e){if(!me(r,e)){if(r.somethingSelected())Fa({lineWise:!1,text:r.getSelections()});else{if(!r.options.lineWiseCopyCut)return;var t=ja(r);Fa({lineWise:!0,text:t.text}),"cut"==e.type?r.setSelections(t.ranges,null,V):(n.prevInput="",i.value=t.text.join("\n"),j(i))}"cut"==e.type&&(r.state.cutIncoming=+new Date)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),m&&(i.style.width="0px"),pe(i,"input",(function(){a&&s>=9&&t.hasSelection&&(t.hasSelection=null),n.poll()})),pe(i,"paste",(function(e){me(r,e)||Ia(e,r)||(r.state.pasteIncoming=+new Date,n.fastPoll())})),pe(i,"cut",o),pe(i,"copy",o),pe(e.scroller,"paste",(function(t){if(!Dn(e,t)&&!me(r,t)){if(!i.dispatchEvent)return r.state.pasteIncoming=+new Date,void n.focus();var o=new Event("paste");o.clipboardData=t.clipboardData,i.dispatchEvent(o)}})),pe(e.lineSpace,"selectstart",(function(t){Dn(e,t)||be(t)})),pe(i,"compositionstart",(function(){var e=r.getCursor("from");n.composing&&n.composing.range.clear(),n.composing={start:e,range:r.markText(e,r.getCursor("to"),{className:"CodeMirror-composing"})}})),pe(i,"compositionend",(function(){n.composing&&(n.poll(),n.composing.range.clear(),n.composing=null)}))},Wa.prototype.createField=function(e){this.wrapper=Pa(),this.textarea=this.wrapper.firstChild},Wa.prototype.screenReaderLabelChanged=function(e){e?this.textarea.setAttribute("aria-label",e):this.textarea.removeAttribute("aria-label")},Wa.prototype.prepareSelection=function(){var e=this.cm,t=e.display,n=e.doc,r=yr(e);if(e.options.moveInputWithCursor){var i=Kn(e,n.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),a=t.lineDiv.getBoundingClientRect();r.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+a.top-o.top)),r.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+a.left-o.left))}return r},Wa.prototype.showSelection=function(e){var t=this.cm.display;A(t.cursorDiv,e.cursors),A(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},Wa.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput="";var n=t.getSelection();this.textarea.value=n,t.state.focused&&j(this.textarea),a&&s>=9&&(this.hasSelection=n)}else e||(this.prevInput=this.textarea.value="",a&&s>=9&&(this.hasSelection=null))}},Wa.prototype.getField=function(){return this.textarea},Wa.prototype.supportsTouch=function(){return!1},Wa.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!y||N()!=this.textarea))try{this.textarea.focus()}catch(e){}},Wa.prototype.blur=function(){this.textarea.blur()},Wa.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Wa.prototype.receivedFocus=function(){this.slowPoll()},Wa.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,(function(){e.poll(),e.cm.state.focused&&e.slowPoll()}))},Wa.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,(function n(){t.poll()||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,n))}))},Wa.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||!t.state.focused||Ne(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(a&&s>=9&&this.hasSelection===i||v&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||r||(r="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var u=0,c=Math.min(r.length,i.length);u1e3||i.indexOf("\n")>-1?n.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))})),!0},Wa.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Wa.prototype.onKeyPress=function(){a&&s>=9&&(this.hasSelection=null),this.fastPoll()},Wa.prototype.onContextMenu=function(e){var t=this,n=t.cm,r=n.display,i=t.textarea;t.contextMenuPending&&t.contextMenuPending();var o=cr(n,e),c=r.scroller.scrollTop;if(o&&!p){n.options.resetSelectionOnContextMenu&&-1==n.doc.sel.contains(o)&&ei(n,Zi)(n.doc,Si(o),V);var l,f=i.style.cssText,d=t.wrapper.style.cssText,h=t.wrapper.offsetParent.getBoundingClientRect();if(t.wrapper.style.cssText="position: static",i.style.cssText="position: absolute; width: 30px; height: 30px;\n top: "+(e.clientY-h.top-5)+"px; left: "+(e.clientX-h.left-5)+"px;\n z-index: 1000; background: "+(a?"rgba(255, 255, 255, .05)":"transparent")+";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",u&&(l=window.scrollY),r.input.focus(),u&&window.scrollTo(null,l),r.input.reset(),n.somethingSelected()||(i.value=t.prevInput=" "),t.contextMenuPending=y,r.selForContextMenu=n.doc.sel,clearTimeout(r.detectingSelectAll),a&&s>=9&&g(),C){De(e);var m=function(){de(window,"mouseup",m),setTimeout(y,20)};pe(window,"mouseup",m)}else setTimeout(y,50)}function g(){if(null!=i.selectionStart){var e=n.somethingSelected(),o="​"+(e?i.value:"");i.value="⇚",i.value=o,t.prevInput=e?"":"​",i.selectionStart=1,i.selectionEnd=o.length,r.selForContextMenu=n.doc.sel}}function y(){if(t.contextMenuPending==y&&(t.contextMenuPending=!1,t.wrapper.style.cssText=d,i.style.cssText=f,a&&s<9&&r.scrollbars.setScrollTop(r.scroller.scrollTop=c),null!=i.selectionStart)){(!a||a&&s<9)&&g();var e=0,o=function(){r.selForContextMenu==n.doc.sel&&0==i.selectionStart&&i.selectionEnd>0&&"​"==t.prevInput?ei(n,so)(n):e++<10?r.detectingSelectAll=setTimeout(o,500):(r.selForContextMenu=null,r.input.reset())};r.detectingSelectAll=setTimeout(o,200)}}},Wa.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e,this.textarea.readOnly=!!e},Wa.prototype.setUneditable=function(){},Wa.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function n(n,r,i,o){e.defaults[n]=r,i&&(t[n]=o?function(e,t,n){n!=Da&&i(e,t,n)}:i)}e.defineOption=n,e.Init=Da,n("value","",(function(e,t){return e.setValue(t)}),!0),n("mode",null,(function(e,t){e.doc.modeOption=t,Oi(e)}),!0),n("indentUnit",2,Oi,!0),n("indentWithTabs",!1),n("smartIndent",!0),n("tabSize",4,(function(e){Fi(e),Un(e),pr(e)}),!0),n("lineSeparator",null,(function(e,t){if(e.doc.lineSep=t,t){var n=[],r=e.doc.first;e.doc.iter((function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,n.push(et(r,o))}r++}));for(var i=n.length-1;i>=0;i--)mo(e.doc,t,n[i],et(n[i].line,n[i].ch+t.length))}})),n("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200c\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g,(function(e,t,n){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),n!=Da&&e.refresh()})),n("specialCharPlaceholder",Xt,(function(e){return e.refresh()}),!0),n("electricChars",!0),n("inputStyle",y?"contenteditable":"textarea",(function(){throw new Error("inputStyle can not (yet) be changed in a running editor")}),!0),n("spellcheck",!1,(function(e,t){return e.getInputField().spellcheck=t}),!0),n("autocorrect",!1,(function(e,t){return e.getInputField().autocorrect=t}),!0),n("autocapitalize",!1,(function(e,t){return e.getInputField().autocapitalize=t}),!0),n("rtlMoveVisually",!E),n("wholeLineUpdateBefore",!0),n("theme","default",(function(e){xa(e),mi(e)}),!0),n("keyMap","default",(function(e,t,n){var r=Yo(t),i=n!=Da&&Yo(n);i&&i.detach&&i.detach(e,r),r.attach&&r.attach(e,i||null)})),n("extraKeys",null),n("configureMouse",null),n("lineWrapping",!1,_a,!0),n("gutters",[],(function(e,t){e.display.gutterSpecs=di(t,e.options.lineNumbers),mi(e)}),!0),n("fixedGutter",!0,(function(e,t){e.display.gutters.style.left=t?ar(e.display)+"px":"0",e.refresh()}),!0),n("coverGutterNextToScrollbar",!1,(function(e){return zr(e)}),!0),n("scrollbarStyle","native",(function(e){Hr(e),zr(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)}),!0),n("lineNumbers",!1,(function(e,t){e.display.gutterSpecs=di(e.options.gutters,t),mi(e)}),!0),n("firstLineNumber",1,mi,!0),n("lineNumberFormatter",(function(e){return e}),mi,!0),n("showCursorWhenSelecting",!1,gr,!0),n("resetSelectionOnContextMenu",!0),n("lineWiseCopyCut",!0),n("pasteLinesPerSelection",!0),n("selectionsMayTouch",!1),n("readOnly",!1,(function(e,t){"nocursor"==t&&(Sr(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)})),n("screenReaderLabel",null,(function(e,t){t=""===t?null:t,e.display.input.screenReaderLabelChanged(t)})),n("disableInput",!1,(function(e,t){t||e.display.input.reset()}),!0),n("dragDrop",!0,Sa),n("allowDropFileTypes",null),n("cursorBlinkRate",530),n("cursorScrollMargin",0),n("cursorHeight",1,gr,!0),n("singleCursorHeightPerLine",!0,gr,!0),n("workTime",100),n("workDelay",100),n("flattenSpans",!0,Fi,!0),n("addModeClass",!1,Fi,!0),n("pollInterval",100),n("undoDepth",200,(function(e,t){return e.doc.history.undoDepth=t})),n("historyEventDelay",1250),n("viewportMargin",10,(function(e){return e.refresh()}),!0),n("maxHighlightLength",1e4,Fi,!0),n("moveInputWithCursor",!0,(function(e,t){t||e.display.input.resetPosition()})),n("tabindex",null,(function(e,t){return e.display.input.getField().tabIndex=t||""})),n("autofocus",null),n("direction","ltr",(function(e,t){return e.doc.setDirection(t)}),!0),n("phrases",null)}(ka),function(e){var t=e.optionHandlers,n=e.helpers={};e.prototype={constructor:e,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,n){var r=this.options,i=r[e];r[e]==n&&"mode"!=e||(r[e]=n,t.hasOwnProperty(e)&&ei(this,t[e])(this,n,i),he(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Yo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,n=0;nn&&(Ta(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&Fr(this));else{var o=i.from(),a=i.to(),s=Math.max(n,o.line);n=Math.min(this.lastLine(),a.line-(a.ch?0:1))+1;for(var u=s;u0&&Yi(this.doc,r,new Ci(o,c[r].to()),V)}}})),getTokenAt:function(e,t){return vt(this,e,t)},getLineTokens:function(e,t){return vt(this,et(e),t,!0)},getTokenTypeAt:function(e){e=st(this.doc,e);var t,n=ft(this,Ge(this.doc,e.line)),r=0,i=(n.length-1)/2,o=e.ch;if(0==o)t=n[2];else for(;;){var a=r+i>>1;if((a?n[2*a-1]:0)>=o)i=a;else{if(!(n[2*a+1]o&&(e=o,i=!0),r=Ge(this.doc,e)}else r=e;return Hn(this,r,{top:0,left:0},t||"page",n||i).top+(i?this.doc.height-qt(r):0)},defaultTextHeight:function(){return rr(this.display)},defaultCharWidth:function(){return ir(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var o,a,s,u=this.display,c=(e=Kn(this,st(this.doc,e))).bottom,l=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),u.sizer.appendChild(t),"over"==r)c=e.top;else if("above"==r||"near"==r){var p=Math.max(u.wrapper.clientHeight,this.doc.height),f=Math.max(u.sizer.clientWidth,u.lineSpace.clientWidth);("above"==r||e.bottom+t.offsetHeight>p)&&e.top>t.offsetHeight?c=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=p&&(c=e.bottom),l+t.offsetWidth>f&&(l=f-t.offsetWidth)}t.style.top=c+"px",t.style.left=t.style.right="","right"==i?(l=u.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?l=0:"middle"==i&&(l=(u.sizer.clientWidth-t.offsetWidth)/2),t.style.left=l+"px"),n&&(o=this,a={left:l,top:c,right:l+t.offsetWidth,bottom:c+t.offsetHeight},null!=(s=Tr(o,a)).scrollTop&&jr(o,s.scrollTop),null!=s.scrollLeft&&Pr(o,s.scrollLeft))},triggerOnKeyDown:ti(la),triggerOnKeyPress:ti(fa),triggerOnKeyUp:pa,triggerOnMouseDown:ti(ga),execCommand:function(e){if(ta.hasOwnProperty(e))return ta[e].call(null,this)},triggerElectric:ti((function(e){Ma(this,e)})),findPosH:function(e,t,n,r){var i=1;t<0&&(i=-1,t=-t);for(var o=st(this.doc,e),a=0;a0&&a(t.charAt(n-1));)--n;for(;r.5||this.options.lineWrapping)&&ur(this),he(this,"refresh",this)})),swapDoc:ti((function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),ji(this,e),Un(this),this.display.input.reset(),Nr(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,un(this,"swapDoc",this,t),t})),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},ve(e),e.registerHelper=function(t,r,i){n.hasOwnProperty(t)||(n[t]=e[t]={_global:[]}),n[t][r]=i},e.registerGlobalHelper=function(t,r,i,o){e.registerHelper(t,r,o),n[t]._global.push({pred:i,val:o})}}(ka);var Ga="iter insert remove copy getEditor constructor".split(" ");for(var Ka in Fo.prototype)Fo.prototype.hasOwnProperty(Ka)&&U(Ga,Ka)<0&&(ka.prototype[Ka]=function(e){return function(){return e.apply(this.doc,arguments)}}(Fo.prototype[Ka]));return ve(Fo),ka.inputStyles={textarea:Wa,contenteditable:Ua},ka.defineMode=function(e){ka.defaults.mode||"null"==e||(ka.defaults.mode=e),Pe.apply(this,arguments)},ka.defineMIME=function(e,t){Le[e]=t},ka.defineMode("null",(function(){return{token:function(e){return e.skipToEnd()}}})),ka.defineMIME("text/plain","null"),ka.defineExtension=function(e,t){ka.prototype[e]=t},ka.defineDocExtension=function(e,t){Fo.prototype[e]=t},ka.fromTextArea=function(e,t){if((t=t?P(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var n=N();t.autofocus=n==e||null!=e.getAttribute("autofocus")&&n==document.body}function r(){e.value=s.getValue()}var i;if(e.form&&(pe(e.form,"submit",r),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var a=o.submit=function(){r(),o.submit=i,o.submit(),o.submit=a}}catch(e){}}t.finishInit=function(n){n.save=r,n.getTextArea=function(){return e},n.toTextArea=function(){n.toTextArea=isNaN,r(),e.parentNode.removeChild(n.getWrapperElement()),e.style.display="",e.form&&(de(e.form,"submit",r),t.leaveSubmitMethodAlone||"function"!=typeof e.form.submit||(e.form.submit=i))}},e.style.display="none";var s=ka((function(t){return e.parentNode.insertBefore(t,e.nextSibling)}),t);return s},function(e){e.off=de,e.on=pe,e.wheelEventPixels=Ei,e.Doc=Fo,e.splitLines=Fe,e.countColumn=R,e.findColumn=W,e.isWordChar=Z,e.Pass=z,e.signal=he,e.Line=Gt,e.changeEnd=_i,e.scrollbarModel=qr,e.Pos=et,e.cmpPos=tt,e.modes=je,e.mimeModes=Le,e.resolveMode=Re,e.getMode=Be,e.modeExtensions=Ue,e.extendMode=ze,e.copyState=Ve,e.startState=He,e.innerMode=qe,e.commands=ta,e.keyMap=qo,e.keyName=Qo,e.isModifierKey=Ko,e.lookupKey=Go,e.normalizeKeyMap=Wo,e.StringStream=We,e.SharedTextMarker=ko,e.TextMarker=So,e.LineWidget=Do,e.e_preventDefault=be,e.e_stopPropagation=Ee,e.e_stop=De,e.addClass=I,e.contains=F,e.rmClass=_,e.keyNames=Bo}(ka),ka.version="5.58.1",ka}()},function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return r})),n.d(t,"versionInfo",(function(){return i})),n.d(t,"graphql",(function(){return de})),n.d(t,"graphqlSync",(function(){return he})),n.d(t,"GraphQLSchema",(function(){return ge.a})),n.d(t,"GraphQLDirective",(function(){return x.c})),n.d(t,"GraphQLScalarType",(function(){return D.g})),n.d(t,"GraphQLObjectType",(function(){return D.f})),n.d(t,"GraphQLInterfaceType",(function(){return D.c})),n.d(t,"GraphQLUnionType",(function(){return D.h})),n.d(t,"GraphQLEnumType",(function(){return D.a})),n.d(t,"GraphQLInputObjectType",(function(){return D.b})),n.d(t,"GraphQLList",(function(){return D.d})),n.d(t,"GraphQLNonNull",(function(){return D.e})),n.d(t,"specifiedScalarTypes",(function(){return ye.g})),n.d(t,"GraphQLInt",(function(){return ye.d})),n.d(t,"GraphQLFloat",(function(){return ye.b})),n.d(t,"GraphQLString",(function(){return ye.e})),n.d(t,"GraphQLBoolean",(function(){return ye.a})),n.d(t,"GraphQLID",(function(){return ye.c})),n.d(t,"specifiedDirectives",(function(){return x.j})),n.d(t,"GraphQLIncludeDirective",(function(){return x.d})),n.d(t,"GraphQLSkipDirective",(function(){return x.e})),n.d(t,"GraphQLDeprecatedDirective",(function(){return x.b})),n.d(t,"GraphQLSpecifiedByDirective",(function(){return x.f})),n.d(t,"TypeKind",(function(){return E.TypeKind})),n.d(t,"DEFAULT_DEPRECATION_REASON",(function(){return x.a})),n.d(t,"introspectionTypes",(function(){return E.introspectionTypes})),n.d(t,"__Schema",(function(){return E.__Schema})),n.d(t,"__Directive",(function(){return E.__Directive})),n.d(t,"__DirectiveLocation",(function(){return E.__DirectiveLocation})),n.d(t,"__Type",(function(){return E.__Type})),n.d(t,"__Field",(function(){return E.__Field})),n.d(t,"__InputValue",(function(){return E.__InputValue})),n.d(t,"__EnumValue",(function(){return E.__EnumValue})),n.d(t,"__TypeKind",(function(){return E.__TypeKind})),n.d(t,"SchemaMetaFieldDef",(function(){return E.SchemaMetaFieldDef})),n.d(t,"TypeMetaFieldDef",(function(){return E.TypeMetaFieldDef})),n.d(t,"TypeNameMetaFieldDef",(function(){return E.TypeNameMetaFieldDef})),n.d(t,"isSchema",(function(){return ge.c})),n.d(t,"isDirective",(function(){return x.h})),n.d(t,"isType",(function(){return D.S})),n.d(t,"isScalarType",(function(){return D.R})),n.d(t,"isObjectType",(function(){return D.N})),n.d(t,"isInterfaceType",(function(){return D.H})),n.d(t,"isUnionType",(function(){return D.T})),n.d(t,"isEnumType",(function(){return D.E})),n.d(t,"isInputObjectType",(function(){return D.F})),n.d(t,"isListType",(function(){return D.J})),n.d(t,"isNonNullType",(function(){return D.L})),n.d(t,"isInputType",(function(){return D.G})),n.d(t,"isOutputType",(function(){return D.O})),n.d(t,"isLeafType",(function(){return D.I})),n.d(t,"isCompositeType",(function(){return D.D})),n.d(t,"isAbstractType",(function(){return D.C})),n.d(t,"isWrappingType",(function(){return D.U})),n.d(t,"isNullableType",(function(){return D.M})),n.d(t,"isNamedType",(function(){return D.K})),n.d(t,"isRequiredArgument",(function(){return D.P})),n.d(t,"isRequiredInputField",(function(){return D.Q})),n.d(t,"isSpecifiedScalarType",(function(){return ye.f})),n.d(t,"isIntrospectionType",(function(){return E.isIntrospectionType})),n.d(t,"isSpecifiedDirective",(function(){return x.i})),n.d(t,"assertSchema",(function(){return ge.b})),n.d(t,"assertDirective",(function(){return x.g})),n.d(t,"assertType",(function(){return D.x})),n.d(t,"assertScalarType",(function(){return D.w})),n.d(t,"assertObjectType",(function(){return D.u})),n.d(t,"assertInterfaceType",(function(){return D.o})),n.d(t,"assertUnionType",(function(){return D.y})),n.d(t,"assertEnumType",(function(){return D.l})),n.d(t,"assertInputObjectType",(function(){return D.m})),n.d(t,"assertListType",(function(){return D.q})),n.d(t,"assertNonNullType",(function(){return D.s})),n.d(t,"assertInputType",(function(){return D.n})),n.d(t,"assertOutputType",(function(){return D.v})),n.d(t,"assertLeafType",(function(){return D.p})),n.d(t,"assertCompositeType",(function(){return D.k})),n.d(t,"assertAbstractType",(function(){return D.j})),n.d(t,"assertWrappingType",(function(){return D.z})),n.d(t,"assertNullableType",(function(){return D.t})),n.d(t,"assertNamedType",(function(){return D.r})),n.d(t,"getNullableType",(function(){return D.B})),n.d(t,"getNamedType",(function(){return D.A})),n.d(t,"validateSchema",(function(){return u.b})),n.d(t,"assertValidSchema",(function(){return u.a})),n.d(t,"Token",(function(){return ve.b})),n.d(t,"Source",(function(){return be.a})),n.d(t,"Location",(function(){return ve.a})),n.d(t,"getLocation",(function(){return Ee.a})),n.d(t,"printLocation",(function(){return xe.a})),n.d(t,"printSourceLocation",(function(){return xe.b})),n.d(t,"Lexer",(function(){return De.a})),n.d(t,"TokenKind",(function(){return Ce.a})),n.d(t,"parse",(function(){return a.a})),n.d(t,"parseValue",(function(){return a.c})),n.d(t,"parseType",(function(){return a.b})),n.d(t,"print",(function(){return A.print})),n.d(t,"visit",(function(){return we.c})),n.d(t,"visitInParallel",(function(){return we.d})),n.d(t,"getVisitFn",(function(){return we.b})),n.d(t,"BREAK",(function(){return we.a})),n.d(t,"Kind",(function(){return b.a})),n.d(t,"DirectiveLocation",(function(){return Se.a})),n.d(t,"isDefinitionNode",(function(){return _e.a})),n.d(t,"isExecutableDefinitionNode",(function(){return _e.b})),n.d(t,"isSelectionNode",(function(){return _e.c})),n.d(t,"isValueNode",(function(){return _e.i})),n.d(t,"isTypeNode",(function(){return _e.f})),n.d(t,"isTypeSystemDefinitionNode",(function(){return _e.g})),n.d(t,"isTypeDefinitionNode",(function(){return _e.d})),n.d(t,"isTypeSystemExtensionNode",(function(){return _e.h})),n.d(t,"isTypeExtensionNode",(function(){return _e.e})),n.d(t,"execute",(function(){return z})),n.d(t,"executeSync",(function(){return V})),n.d(t,"defaultFieldResolver",(function(){return pe})),n.d(t,"defaultTypeResolver",(function(){return le})),n.d(t,"responsePathAsArray",(function(){return g})),n.d(t,"getDirectiveValues",(function(){return B})),n.d(t,"subscribe",(function(){return Ne})),n.d(t,"createSourceEventStream",(function(){return je})),n.d(t,"validate",(function(){return s.c})),n.d(t,"ValidationContext",(function(){return Pe.b})),n.d(t,"specifiedRules",(function(){return Re.a})),n.d(t,"ExecutableDefinitionsRule",(function(){return Be.a})),n.d(t,"FieldsOnCorrectTypeRule",(function(){return Ue.a})),n.d(t,"FragmentsOnCompositeTypesRule",(function(){return ze.a})),n.d(t,"KnownArgumentNamesRule",(function(){return Ve.b})),n.d(t,"KnownDirectivesRule",(function(){return qe.a})),n.d(t,"KnownFragmentNamesRule",(function(){return He.a})),n.d(t,"KnownTypeNamesRule",(function(){return We.a})),n.d(t,"LoneAnonymousOperationRule",(function(){return Ge.a})),n.d(t,"NoFragmentCyclesRule",(function(){return Ke.a})),n.d(t,"NoUndefinedVariablesRule",(function(){return Je.a})),n.d(t,"NoUnusedFragmentsRule",(function(){return Qe.a})),n.d(t,"NoUnusedVariablesRule",(function(){return Ye.a})),n.d(t,"OverlappingFieldsCanBeMergedRule",(function(){return $e.a})),n.d(t,"PossibleFragmentSpreadsRule",(function(){return Xe.a})),n.d(t,"ProvidedRequiredArgumentsRule",(function(){return Ze.b})),n.d(t,"ScalarLeafsRule",(function(){return et.a})),n.d(t,"SingleFieldSubscriptionsRule",(function(){return tt.a})),n.d(t,"UniqueArgumentNamesRule",(function(){return nt.a})),n.d(t,"UniqueDirectivesPerLocationRule",(function(){return rt.a})),n.d(t,"UniqueFragmentNamesRule",(function(){return it.a})),n.d(t,"UniqueInputFieldNamesRule",(function(){return ot.a})),n.d(t,"UniqueOperationNamesRule",(function(){return at.a})),n.d(t,"UniqueVariableNamesRule",(function(){return st.a})),n.d(t,"ValuesOfCorrectTypeRule",(function(){return ut.a})),n.d(t,"VariablesAreInputTypesRule",(function(){return ct.a})),n.d(t,"VariablesInAllowedPositionRule",(function(){return lt.a})),n.d(t,"LoneSchemaDefinitionRule",(function(){return pt.a})),n.d(t,"UniqueOperationTypesRule",(function(){return ft.a})),n.d(t,"UniqueTypeNamesRule",(function(){return dt.a})),n.d(t,"UniqueEnumValueNamesRule",(function(){return ht.a})),n.d(t,"UniqueFieldDefinitionNamesRule",(function(){return mt.a})),n.d(t,"UniqueDirectiveNamesRule",(function(){return gt.a})),n.d(t,"PossibleTypeExtensionsRule",(function(){return yt.a})),n.d(t,"NoDeprecatedCustomRule",(function(){return vt.a})),n.d(t,"NoSchemaIntrospectionCustomRule",(function(){return bt})),n.d(t,"GraphQLError",(function(){return y.a})),n.d(t,"syntaxError",(function(){return Et.a})),n.d(t,"locatedError",(function(){return v.a})),n.d(t,"printError",(function(){return y.b})),n.d(t,"formatError",(function(){return xt})),n.d(t,"getIntrospectionQuery",(function(){return wt})),n.d(t,"getOperationAST",(function(){return St.getOperationAST})),n.d(t,"getOperationRootType",(function(){return w})),n.d(t,"introspectionFromSchema",(function(){return At})),n.d(t,"buildClientSchema",(function(){return Ot})),n.d(t,"buildASTSchema",(function(){return Vt})),n.d(t,"buildSchema",(function(){return qt})),n.d(t,"getDescription",(function(){return zt})),n.d(t,"extendSchema",(function(){return Lt})),n.d(t,"lexicographicSortSchema",(function(){return Kt})),n.d(t,"printSchema",(function(){return Xt})),n.d(t,"printType",(function(){return rn})),n.d(t,"printIntrospectionSchema",(function(){return Zt})),n.d(t,"typeFromAST",(function(){return C.a})),n.d(t,"valueFromAST",(function(){return O})),n.d(t,"valueFromASTUntyped",(function(){return dn.a})),n.d(t,"astFromValue",(function(){return $t.a})),n.d(t,"TypeInfo",(function(){return hn.a})),n.d(t,"visitWithTypeInfo",(function(){return hn.b})),n.d(t,"coerceInputValue",(function(){return M})),n.d(t,"concatAST",(function(){return gn})),n.d(t,"separateOperations",(function(){return yn})),n.d(t,"stripIgnoredCharacters",(function(){return bn})),n.d(t,"isEqualType",(function(){return xn.b})),n.d(t,"isTypeSubTypeOf",(function(){return xn.c})),n.d(t,"doTypesOverlap",(function(){return xn.a})),n.d(t,"assertValidName",(function(){return Dn.a})),n.d(t,"isValidNameError",(function(){return Dn.b})),n.d(t,"BreakingChangeType",(function(){return _n})),n.d(t,"DangerousChangeType",(function(){return kn})),n.d(t,"findBreakingChanges",(function(){return An})),n.d(t,"findDangerousChanges",(function(){return Tn})),n.d(t,"findDeprecatedUsages",(function(){return Vn.a}));var r="15.3.0",i=Object.freeze({major:15,minor:3,patch:0,preReleaseTag:null});function o(e){return"function"==typeof(null==e?void 0:e.then)}var a=n(64),s=n(65),u=n(79),c=n(57),l=n(4);var p=n(18),f=n(8),d=n(31),h=n(80);function m(e,t,n){return{prev:e,key:t,typename:n}}function g(e){for(var t=[],n=e;n;)t.push(n.key),n=n.prev;return t.reverse()}var y=n(2),v=n(81),b=n(1),E=n(12),x=n(21),D=n(0),C=n(33);function w(e,t){if("query"===t.operation){var n=e.getQueryType();if(!n)throw new y.a("Schema does not define the required query root type.",t);return n}if("mutation"===t.operation){var r=e.getMutationType();if(!r)throw new y.a("Schema is not configured for mutations.",t);return r}if("subscription"===t.operation){var i=e.getSubscriptionType();if(!i)throw new y.a("Schema is not configured for subscriptions.",t);return i}throw new y.a("Can only have query, mutation and subscription operations.",t)}var S=n(55),_=n(36);function k(e){return e.map((function(e){return"number"==typeof e?"["+e.toString()+"]":"."+e})).join("")}var A=n(15),T=n(14);function O(e,t,n){if(e){if(e.kind===b.a.VARIABLE){var r=e.name.value;if(null==n||void 0===n[r])return;var i=n[r];if(null===i&&Object(D.L)(t))return;return i}if(Object(D.L)(t)){if(e.kind===b.a.NULL)return;return O(e,t.ofType,n)}if(e.kind===b.a.NULL)return null;if(Object(D.J)(t)){var o=t.ofType;if(e.kind===b.a.LIST){for(var a=[],s=0,u=e.values;s2&&void 0!==arguments[2]?arguments[2]:j;return L(e,t,n)}function j(e,t,n){var r="Invalid value "+Object(l.a)(t);throw e.length>0&&(r+=' at "value'.concat(k(e),'"')),n.message=r+": "+n.message,n}function L(e,t,n,r){if(Object(D.L)(t))return null!=e?L(e,t.ofType,n,r):void n(g(r),e,new y.a('Expected non-nullable type "'.concat(Object(l.a)(t),'" not to be null.')));if(null==e)return null;if(Object(D.J)(t)){var i=t.ofType;return Object(h.a)(e)?Object(c.a)(e,(function(e,t){var o=m(r,t,void 0);return L(e,i,n,o)})):[L(e,i,n,r)]}if(Object(D.F)(t)){if(!Object(d.a)(e))return void n(g(r),e,new y.a('Expected type "'.concat(t.name,'" to be an object.')));for(var o={},a=t.getFields(),s=0,u=Object(T.a)(a);s0&&(i+=' at "'.concat(s).concat(k(e),'"')),r(new y.a(i+"; "+n.message,a,void 0,void 0,void 0,n.originalError))}))},a=0;a=o)throw new y.a("Too many errors processing variables, error limit reached. Execution aborted.");i.push(e)}));if(0===i.length)return{coerced:a}}catch(e){i.push(e)}return{errors:i}}function R(e,t,n){for(var r,i={},o=null!==(r=t.arguments)&&void 0!==r?r:[],a=Object(_.a)(o,(function(e){return e.name.value})),s=0,u=e.args;s0)return{errors:d};try{t=Object(a.a)(r)}catch(e){return{errors:[e]}}var h=Object(s.c)(n,t);return h.length>0?{errors:h}:z({schema:n,document:t,rootValue:i,contextValue:o,variableValues:c,operationName:l,fieldResolver:p,typeResolver:f})}var ge=n(53),ye=n(13),ve=n(24),be=n(82),Ee=n(94),xe=n(137),De=n(83),Ce=n(5),we=n(26),Se=n(9),_e=n(45),ke=n(25);function Ae(e,t,n){var r,i,o,a,s,u,c=e[ke.a].call(e);function l(e){return e.done?e:Te(e.value,t).then(Oe,i)}if("function"==typeof c.return&&(r=c.return,i=function(e){var t=function(){return Promise.reject(e)};return r.call(c).then(t,t)}),n){var p=n;o=function(e){return Te(e,p).then(Oe,i)}}return a={next:function(){return c.next().then(l,o)},return:function(){return r?r.call(c).then(l,o):Promise.resolve({value:void 0,done:!0})},throw:function(e){return"function"==typeof c.throw?c.throw(e).then(l,o):Promise.reject(e).catch(i)}},s=ke.a,u=function(){return this},s in a?Object.defineProperty(a,s,{value:u,enumerable:!0,configurable:!0,writable:!0}):a[s]=u,a}function Te(e,t){return new Promise((function(n){return n(t(e))}))}function Oe(e){return{value:e,done:!1}}function Fe(e){return(Fe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ne(e,t,n,r,i,o,a,s){return 1===arguments.length?Me(e):Me({schema:e,document:t,rootValue:n,contextValue:r,variableValues:i,operationName:o,fieldResolver:a,subscribeFieldResolver:s})}function Ie(e){if(e instanceof y.a)return{errors:[e]};throw e}function Me(e){var t=e.schema,n=e.document,r=e.rootValue,i=e.contextValue,o=e.variableValues,a=e.operationName,s=e.fieldResolver,u=e.subscribeFieldResolver,c=je(t,n,r,i,o,a,u),l=function(e){return z({schema:t,document:n,rootValue:e,contextValue:i,variableValues:o,operationName:a,fieldResolver:s})};return c.then((function(e){return Le(e)?Ae(e,l,Ie):e}))}function je(e,t,n,r,i,o,a){H(e,t,i);try{var s,u=W(e,t,n,r,i,o,a);if(Array.isArray(u))return Promise.resolve({errors:u});var c=w(e,u.operation),p=K(u,c,u.operation.selectionSet,Object.create(null),Object.create(null)),f=Object.keys(p)[0],d=p[f],h=d[0].name.value,b=fe(e,c,h);if(!b)throw new y.a('The subscription field "'.concat(h,'" is not defined.'),d);var E=null!==(s=b.subscribe)&&void 0!==s?s:u.fieldResolver,x=m(void 0,f,c.name),D=$(u,b,d,c,x),C=X(u,b,d,E,n,D);return Promise.resolve(C).then((function(e){if(e instanceof Error)return{errors:[Object(v.a)(e,d,g(x))]};if(Le(e))return e;throw new Error("Subscription field must return Async Iterable. "+"Received: ".concat(Object(l.a)(e),"."))}))}catch(e){return e instanceof y.a?Promise.resolve({errors:[e]}):Promise.reject(e)}}function Le(e){return null!=e&&"object"===Fe(e)&&"function"==typeof e[ke.a]}var Pe=n(146),Re=n(138),Be=n(212),Ue=n(219),ze=n(216),Ve=n(142),qe=n(140),He=n(221),We=n(139),Ge=n(214),Ke=n(224),Je=n(226),Qe=n(222),Ye=n(227),$e=n(230),Xe=n(223),Ze=n(144),et=n(218),tt=n(215),nt=n(143),rt=n(141),it=n(220),ot=n(145),at=n(213),st=n(225),ut=n(228),ct=n(217),lt=n(229),pt=n(231),ft=n(232),dt=n(233),ht=n(234),mt=n(235),gt=n(236),yt=n(237),vt=n(238);function bt(e){return{Field:function(t){var n=Object(D.A)(e.getType());n&&Object(E.isIntrospectionType)(n)&&e.reportError(new y.a('GraphQL introspection has been disabled, but the requested query contained the field "'.concat(t.name.value,'".'),t))}}}var Et=n(44);function xt(e){var t;e||Object(f.a)(0,"Received null or undefined error.");var n=null!==(t=e.message)&&void 0!==t?t:"An unknown error occurred.",r=e.locations,i=e.path,o=e.extensions;return o?{message:n,locations:r,path:i,extensions:o}:{message:n,locations:r,path:i}}function Dt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ct(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function wt(e){var t=function(e){for(var t=1;t0?n.reverse().join("\n"):void 0}(e);if(void 0!==n)return Object(Nt.a)("\n"+n)}}function Vt(e,t){null!=e&&e.kind===b.a.DOCUMENT||Object(f.a)(0,"Must provide valid Document AST."),!0!==(null==t?void 0:t.assumeValid)&&!0!==(null==t?void 0:t.assumeValidSDL)&&Object(s.a)(e);var n=Pt({description:void 0,types:[],directives:[],extensions:void 0,extensionASTNodes:[],assumeValid:!1},e,t);if(null==n.astNode)for(var r=0,i=n.types;r2&&void 0!==arguments[2]?arguments[2]:"";return 0===t.length?"":t.every((function(e){return!e.description}))?"("+t.map(cn).join(", ")+")":"(\n"+t.map((function(t,r){return pn(e,t," "+n,!r)+" "+n+cn(t)})).join("\n")+"\n"+n+")"}function cn(e){var t=Object($t.a)(e.defaultValue,e.type),n=e.name+": "+String(e.type);return t&&(n+=" = ".concat(Object(A.print)(t))),n}function ln(e){if(!e.isDeprecated)return"";var t=e.deprecationReason,n=Object($t.a)(t,ye.e);return n&&t!==x.a?" @deprecated(reason: "+Object(A.print)(n)+")":" @deprecated"}function pn(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=t.description;if(null==i)return"";if(!0===(null==e?void 0:e.commentDescriptions))return fn(i,n,r);var o=i.length>70,a=Object(Nt.c)(i,"",o),s=n&&!r?"\n"+n:n;return s+a.replace(/\n/g,"\n"+n)+"\n"}function fn(e,t,n){return(t&&!n?"\n":"")+e.split("\n").map((function(e){return t+(""!==e?"# "+e:"#")})).join("\n")+"\n"}var dn=n(210),hn=n(84),mn=n(113);function gn(e){return{kind:"Document",definitions:Object(mn.a)(e,(function(e){return e.definitions}))}}function yn(e){var t,n=[],r=Object.create(null);Object(we.c)(e,{OperationDefinition:function(e){t=vn(e),n.push(e)},FragmentDefinition:function(e){t=e.name.value},FragmentSpread:function(e){var n=e.name.value,i=r[t];void 0===i&&(i=r[t]=Object.create(null)),i[n]=!0}});for(var i=Object.create(null),o=function(t){var o=n[t],a=vn(o),s=Object.create(null);!function e(t,n,r){var i=n[r];if(i)for(var o=0,a=Object.keys(i);o0&&(n="\n"+n);var i=n[n.length-1];return('"'===i&&'\\"""'!==n.slice(-4)||"\\"===i)&&(n+="\n"),'"""'+n+'"""'}var xn=n(61),Dn=n(211);function Cn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function wn(e){for(var t=1;t=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function a(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var s=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,u=new RegExp(s.source+"|"+/&([a-z#][a-z0-9]{1,31});/gi.source,"gi"),c=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,l=n(171);var p=/[&<>"]/,f=/[&<>"]/g,d={"&":"&","<":"<",">":">",'"':"""};function h(e){return d[e]}var m=/[.?*+^$[\]\\(){}|-]/g;var g=n(88);t.lib={},t.lib.mdurl=n(102),t.lib.ucmicro=n(172),t.assign=function(e){var t=Array.prototype.slice.call(arguments,1);return t.forEach((function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach((function(n){e[n]=t[n]}))}})),e},t.isString=function(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)},t.has=i,t.unescapeMd=function(e){return e.indexOf("\\")<0?e:e.replace(s,"$1")},t.unescapeAll=function(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(u,(function(e,t,n){return t||function(e,t){var n=0;return i(l,t)?l[t]:35===t.charCodeAt(0)&&c.test(t)&&o(n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?a(n):e}(e,n)}))},t.isValidEntityCode=o,t.fromCodePoint=a,t.escapeHtml=function(e){return p.test(e)?e.replace(f,h):e},t.arrayReplaceAt=function(e,t,n){return[].concat(e.slice(0,t),n,e.slice(t+1))},t.isSpace=function(e){switch(e){case 9:case 32:return!0}return!1},t.isWhiteSpace=function(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1},t.isMdAsciiPunct=function(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}},t.isPunctChar=function(e){return g.test(e)},t.escapeRE=function(e){return e.replace(m,"\\$&")},t.normalizeReference=function(e){return e=e.trim().replace(/\s+/g," "),"Ṿ"==="ẞ".toLowerCase()&&(e=e.replace(/ẞ/g,"ß")),e.toLowerCase().toUpperCase()}},function(e,t,n){"use strict";var r=Object.prototype.hasOwnProperty;function i(e,t){return r.call(e,t)}function o(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function a(e){if(e>65535){var t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var s=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,u=new RegExp(s.source+"|"+/&([a-z#][a-z0-9]{1,31});/gi.source,"gi"),c=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,l=n(194);var p=/[&<>"]/,f=/[&<>"]/g,d={"&":"&","<":"<",">":">",'"':"""};function h(e){return d[e]}var m=/[.?*+^$[\]\\(){}|-]/g;var g=n(88);t.lib={},t.lib.mdurl=n(102),t.lib.ucmicro=n(172),t.assign=function(e){var t=Array.prototype.slice.call(arguments,1);return t.forEach((function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach((function(n){e[n]=t[n]}))}})),e},t.isString=function(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)},t.has=i,t.unescapeMd=function(e){return e.indexOf("\\")<0?e:e.replace(s,"$1")},t.unescapeAll=function(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(u,(function(e,t,n){return t||function(e,t){var n=0;return i(l,t)?l[t]:35===t.charCodeAt(0)&&c.test(t)&&o(n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?a(n):e}(e,n)}))},t.isValidEntityCode=o,t.fromCodePoint=a,t.escapeHtml=function(e){return p.test(e)?e.replace(f,h):e},t.arrayReplaceAt=function(e,t,n){return[].concat(e.slice(0,t),n,e.slice(t+1))},t.isSpace=function(e){switch(e){case 9:case 32:return!0}return!1},t.isWhiteSpace=function(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1},t.isMdAsciiPunct=function(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}},t.isPunctChar=function(e){return g.test(e)},t.escapeRE=function(e){return e.replace(m,"\\$&")},t.normalizeReference=function(e){return e=e.trim().replace(/\s+/g," "),"Ṿ"==="ẞ".toLowerCase()&&(e=e.replace(/ẞ/g,"ß")),e.toLowerCase().toUpperCase()}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return a}));var r=n(46),i=function(){function e(e,t,n){this.start=e.start,this.end=t.end,this.startToken=e,this.endToken=t,this.source=n}return e.prototype.toJSON=function(){return{start:this.start,end:this.end}},e}();Object(r.a)(i);var o=function(){function e(e,t,n,r,i,o,a){this.kind=e,this.start=t,this.end=n,this.line=r,this.column=i,this.value=a,this.prev=o,this.next=null}return e.prototype.toJSON=function(){return{kind:this.kind,value:this.value,line:this.line,column:this.column}},e}();function a(e){return null!=e&&"string"==typeof e.kind}Object(r.a)(o)},function(e,t,n){"use strict";n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return i})),n.d(t,"c",(function(){return o}));var r="function"==typeof Symbol?Symbol.iterator:"@@iterator",i="function"==typeof Symbol?Symbol.asyncIterator:"@@asyncIterator",o="function"==typeof Symbol?Symbol.toStringTag:"@@toStringTag"},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return s})),n.d(t,"d",(function(){return u})),n.d(t,"b",(function(){return c}));var r=n(4),i=n(24),o={Name:[],Document:["definitions"],OperationDefinition:["name","variableDefinitions","directives","selectionSet"],VariableDefinition:["variable","type","defaultValue","directives"],Variable:["name"],SelectionSet:["selections"],Field:["alias","name","arguments","directives","selectionSet"],Argument:["name","value"],FragmentSpread:["name","directives"],InlineFragment:["typeCondition","directives","selectionSet"],FragmentDefinition:["name","variableDefinitions","typeCondition","directives","selectionSet"],IntValue:[],FloatValue:[],StringValue:[],BooleanValue:[],NullValue:[],EnumValue:[],ListValue:["values"],ObjectValue:["fields"],ObjectField:["name","value"],Directive:["name","arguments"],NamedType:["name"],ListType:["type"],NonNullType:["type"],SchemaDefinition:["description","directives","operationTypes"],OperationTypeDefinition:["type"],ScalarTypeDefinition:["description","name","directives"],ObjectTypeDefinition:["description","name","interfaces","directives","fields"],FieldDefinition:["description","name","arguments","type","directives"],InputValueDefinition:["description","name","type","defaultValue","directives"],InterfaceTypeDefinition:["description","name","interfaces","directives","fields"],UnionTypeDefinition:["description","name","directives","types"],EnumTypeDefinition:["description","name","directives","values"],EnumValueDefinition:["description","name","directives"],InputObjectTypeDefinition:["description","name","directives","fields"],DirectiveDefinition:["description","name","arguments","locations"],SchemaExtension:["directives","operationTypes"],ScalarTypeExtension:["name","directives"],ObjectTypeExtension:["name","interfaces","directives","fields"],InterfaceTypeExtension:["name","interfaces","directives","fields"],UnionTypeExtension:["name","directives","types"],EnumTypeExtension:["name","directives","values"],InputObjectTypeExtension:["name","directives","fields"]},a=Object.freeze({});function s(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:o,s=void 0,u=Array.isArray(e),l=[e],p=-1,f=[],d=void 0,h=void 0,m=void 0,g=[],y=[],v=e;do{var b=++p===l.length,E=b&&0!==f.length;if(b){if(h=0===y.length?void 0:g[g.length-1],d=m,m=y.pop(),E){if(u)d=d.slice();else{for(var x={},D=0,C=Object.keys(d);D1&&void 0!==arguments[1]?arguments[1]:r,n=null,o=null;return function(){return i(t,n,arguments)||(o=e.apply(null,arguments)),n=arguments,o}}function a(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return typeof e})).join(", ");throw new Error("Selector creators expect all input-selectors to be functions, instead received the following types: ["+n+"]")}return t}function s(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:u;if("object"!=typeof e)throw new Error("createStructuredSelector expects first argument to be an object where each property is a selector, instead received a "+typeof e);var n=Object.keys(e);return t(n.map((function(t){return e[t]})),(function(){for(var e=arguments.length,t=Array(e),r=0;r=0||(i[n]=e[n]);return i}var h=n(136),m=n.n(h),g=n(78),y=[],v=[null,null];function b(e,t){var n=e[1];return[t.payload,n+1]}function E(e,t,n){l((function(){return e.apply(void 0,t)}),n)}function x(e,t,n,r,i,o,a){e.current=r,t.current=i,n.current=!1,o.current&&(o.current=null,a())}function D(e,t,n,r,i,o,a,s,u,c){if(e){var l=!1,p=null,f=function(){if(!l){var e,n,f=t.getState();try{e=r(f,i.current)}catch(e){n=e,p=e}n||(p=null),e===o.current?a.current||u():(o.current=e,s.current=e,a.current=!0,c({type:"STORE_UPDATED",payload:{error:n}}))}};n.onStateChange=f,n.trySubscribe(),f();return function(){if(l=!0,n.tryUnsubscribe(),n.onStateChange=null,p)throw p}}}var C=function(){return[null,0]};function w(e,t){void 0===t&&(t={});var n=t,a=n.getDisplayName,s=void 0===a?function(e){return"ConnectAdvanced("+e+")"}:a,u=n.methodName,l=void 0===u?"connectAdvanced":u,p=n.renderCountProp,h=void 0===p?void 0:p,w=n.shouldHandleStateChanges,S=void 0===w||w,_=n.storeKey,k=void 0===_?"store":_,A=(n.withRef,n.forwardRef),T=void 0!==A&&A,O=n.context,F=void 0===O?o:O,N=d(n,["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef","forwardRef","context"]),I=F;return function(t){var n=t.displayName||t.name||"Component",o=s(n),a=f({},N,{getDisplayName:s,methodName:l,renderCountProp:h,shouldHandleStateChanges:S,storeKey:k,displayName:o,wrappedComponentName:n,WrappedComponent:t}),u=N.pure;var p=u?r.useMemo:function(e){return e()};function w(n){var o=Object(r.useMemo)((function(){var e=n.reactReduxForwardedRef,t=d(n,["reactReduxForwardedRef"]);return[n.context,e,t]}),[n]),s=o[0],u=o[1],l=o[2],h=Object(r.useMemo)((function(){return s&&s.Consumer&&Object(g.isContextConsumer)(i.a.createElement(s.Consumer,null))?s:I}),[s,I]),m=Object(r.useContext)(h),w=Boolean(n.store)&&Boolean(n.store.getState)&&Boolean(n.store.dispatch);Boolean(m)&&Boolean(m.store);var _=w?n.store:m.store,k=Object(r.useMemo)((function(){return function(t){return e(t.dispatch,a)}(_)}),[_]),A=Object(r.useMemo)((function(){if(!S)return v;var e=new c(_,w?null:m.subscription),t=e.notifyNestedSubs.bind(e);return[e,t]}),[_,w,m]),T=A[0],O=A[1],F=Object(r.useMemo)((function(){return w?m:f({},m,{subscription:T})}),[w,m,T]),N=Object(r.useReducer)(b,y,C),M=N[0][0],j=N[1];if(M&&M.error)throw M.error;var L=Object(r.useRef)(),P=Object(r.useRef)(l),R=Object(r.useRef)(),B=Object(r.useRef)(!1),U=p((function(){return R.current&&l===P.current?R.current:k(_.getState(),l)}),[_,M,l]);E(x,[P,L,B,l,U,R,O]),E(D,[S,_,T,k,P,L,B,R,O,j],[_,T,k]);var z=Object(r.useMemo)((function(){return i.a.createElement(t,f({},U,{ref:u}))}),[u,t,U]);return Object(r.useMemo)((function(){return S?i.a.createElement(h.Provider,{value:F},z):z}),[h,z,F])}var _=u?i.a.memo(w):w;if(_.WrappedComponent=t,_.displayName=o,T){var A=i.a.forwardRef((function(e,t){return i.a.createElement(_,f({},e,{reactReduxForwardedRef:t}))}));return A.displayName=o,A.WrappedComponent=t,m()(A,t)}return m()(_,t)}}function S(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}function _(e,t){if(S(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(var i=0;i=0;r--){var i=t[r](e);if(i)return i}return function(t,r){throw new Error("Invalid value of type "+typeof e+" for "+n+" argument when connecting component "+r.wrappedComponentName+".")}}function B(e,t){return e===t}function U(e){var t=void 0===e?{}:e,n=t.connectHOC,r=void 0===n?w:n,i=t.mapStateToPropsFactories,o=void 0===i?N:i,a=t.mapDispatchToPropsFactories,s=void 0===a?F:a,u=t.mergePropsFactories,c=void 0===u?M:u,l=t.selectorFactory,p=void 0===l?P:l;return function(e,t,n,i){void 0===i&&(i={});var a=i,u=a.pure,l=void 0===u||u,h=a.areStatesEqual,m=void 0===h?B:h,g=a.areOwnPropsEqual,y=void 0===g?_:g,v=a.areStatePropsEqual,b=void 0===v?_:v,E=a.areMergedPropsEqual,x=void 0===E?_:E,D=d(a,["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"]),C=R(e,o,"mapStateToProps"),w=R(t,s,"mapDispatchToProps"),S=R(n,c,"mergeProps");return r(p,f({methodName:"connect",getDisplayName:function(e){return"Connect("+e+")"},shouldHandleStateChanges:Boolean(e),initMapStateToProps:C,initMapDispatchToProps:w,initMergeProps:S,pure:l,areStatesEqual:m,areOwnPropsEqual:y,areStatePropsEqual:b,areMergedPropsEqual:x},D))}}var z=U();function V(){return Object(r.useContext)(o)}function q(e){void 0===e&&(e=o);var t=e===o?V:function(){return Object(r.useContext)(e)};return function(){return t().store}}var H=q();function W(e){void 0===e&&(e=o);var t=e===o?H:q(e);return function(){return t().dispatch}}var G=W(),K=function(e,t){return e===t};function J(e){void 0===e&&(e=o);var t=e===o?V:function(){return Object(r.useContext)(e)};return function(e,n){void 0===n&&(n=K);var i=t(),o=function(e,t,n,i){var o,a=Object(r.useReducer)((function(e){return e+1}),0)[1],s=Object(r.useMemo)((function(){return new c(n,i)}),[n,i]),u=Object(r.useRef)(),p=Object(r.useRef)(),f=Object(r.useRef)(),d=Object(r.useRef)(),h=n.getState();try{if(e!==p.current||h!==f.current||u.current){var m=e(h);o=void 0!==d.current&&t(m,d.current)?d.current:m}else o=d.current}catch(e){throw u.current&&(e.message+="\nThe error may be correlated with this previous error:\n"+u.current.stack+"\n\n"),e}return l((function(){p.current=e,f.current=h,d.current=o,u.current=void 0})),l((function(){function e(){try{var e=p.current(n.getState());if(t(e,d.current))return;d.current=e}catch(e){u.current=e}a()}return s.onStateChange=e,s.trySubscribe(),e(),function(){return s.tryUnsubscribe()}}),[n,s]),o}(e,n,i.store,i.subscription);return Object(r.useDebugValue)(o),o}}var Q,Y=J(),$=n(58);Q=$.unstable_batchedUpdates,a=Q},function(e,t,n){"use strict";function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function i(e){return"object"==r(e)&&null!==e}n.d(t,"a",(function(){return i}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(28),i=n(41);function o(e){return e.get("selectedWorkspace")}t.getSessionsState=r.createSelector([function(e){return e.getIn(["workspaces",o(e)])||i.makeWorkspace("")}],(function(e){return e.get("sessions")})),t.getSelectedSession=r.createSelector([t.getSessionsState],(function(e){var n=t.getSelectedSessionId(e);return e.getIn(["sessions",n])})),t.getSelectedSessionId=function(e){return e.selectedSessionId&&""!==e.selectedSessionId?e.selectedSessionId:e.sessions.first().id},t.getSelectedSessionIdFromRoot=r.createSelector([t.getSelectedSession],(function(e){return e.get("id")}));var a=function(e){return r.createSelector([t.getSelectedSession],(function(t){return t.get(e)}))};function s(e){return e.getIn(["settingsString"])}function u(e){try{return JSON.parse(e)}catch(e){}return{}}function c(e){var t=e.variables;try{return JSON.parse(t)}catch(e){}return{}}t.getScrollTop=a("scrollTop"),t.getEndpoint=a("endpoint"),t.getQuery=a("query"),t.getFile=a("file"),t.getVariables=a("variables"),t.getResponses=a("responses"),t.getOperationName=a("operationName"),t.getQueryRunning=a("queryRunning"),t.getSubscriptionActive=a("subscriptionActive"),t.getOperations=a("operations"),t.getVariableToType=a("variableToType"),t.getQueryTypes=a("queryTypes"),t.getDate=a("date"),t.getHasMutation=a("hasMutation"),t.getHasSubscription=a("hasSubscription"),t.getHasQuery=a("hasQuery"),t.getIsFile=a("isFile"),t.getStarred=a("starred"),t.getName=a("name"),t.getFilePath=a("filePath"),t.getSelectedUserToken=a("selectedUserToken"),t.getHeaders=a("headers"),t.getHasChanged=a("hasChanged"),t.getAbsolutePath=a("absolutePath"),t.getIsSettingsTab=a("isSettingsTab"),t.getIsConfigTab=a("isConfigTab"),t.getCurrentQueryStartTime=a("currentQueryStartTime"),t.getCurrentQueryEndTime=a("currentQueryEndTime"),t.getIsReloadingSchema=a("isReloadingSchema"),t.getIsPollingSchema=r.createSelector([t.getEndpoint,s],(function(e,t){var n=JSON.parse(t);try{return n["schema.polling.enable"]&&e.match("/"+n["schema.polling.endpointFilter"])&&!0}catch(e){return!1}})),t.getResponseExtensions=a("responseExtensions"),t.getQueryVariablesActive=a("queryVariablesActive"),t.getEndpointUnreachable=a("endpointUnreachable"),t.getEditorFlex=a("editorFlex"),t.getVariableEditorOpen=a("variableEditorOpen"),t.getVariableEditorHeight=a("variableEditorHeight"),t.getResponseTracingOpen=a("responseTracingOpen"),t.getResponseTracingHeight=a("responseTracingHeight"),t.getDocExplorerWidth=a("docExplorerWidth"),t.getNextQueryStartTime=a("nextQueryStartTime"),t.getTracingSupported=a("tracingSupported"),t.getTabWidth=r.createSelector([s],(function(e){try{return JSON.parse(e)["prettier.tabWidth"]||2}catch(e){}return 2})),t.getUseTabs=r.createSelector([s],(function(e){try{return JSON.parse(e)["prettier.useTabs"]||!1}catch(e){}return!1})),t.getHeadersCount=r.createSelector([t.getHeaders],(function(e){try{var t=JSON.parse(e);return Object.keys(t).length}catch(e){}return 0})),t.getParsedHeaders=r.createSelector([t.getSelectedSession],u),t.getParsedHeadersFromSession=u,t.getParsedVariables=r.createSelector([t.getSelectedSession],c),t.getParsedVariablesFromSession=c,t.getTracing=r.createSelector([t.getResponseExtensions],(function(e){return e&&e.tracing})),t.getSessionsArray=r.createSelector([t.getSessionsState],(function(e){return e.get("sessions").toArray().map((function(e){return e[1]}))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(4),i=n(18),o=n(1),a=n(0);function s(e,t){var n;return t.kind===o.a.LIST_TYPE?(n=s(e,t.type))&&Object(a.d)(n):t.kind===o.a.NON_NULL_TYPE?(n=s(e,t.type))&&Object(a.e)(n):t.kind===o.a.NAMED_TYPE?e.getType(t.name.value):void Object(i.a)(0,"Unexpected type node: "+Object(r.a)(t))}},function(e,t,n){"use strict";n.r(t),n.d(t,"version",(function(){return rr})),n.d(t,"Collection",(function(){return v})),n.d(t,"Iterable",(function(){return or})),n.d(t,"Seq",(function(){return R})),n.d(t,"Map",(function(){return Et})),n.d(t,"OrderedMap",(function(){return rn})),n.d(t,"List",(function(){return qt})),n.d(t,"Stack",(function(){return cn})),n.d(t,"Set",(function(){return bn})),n.d(t,"OrderedSet",(function(){return Vn})),n.d(t,"Record",(function(){return Kn})),n.d(t,"Range",(function(){return _n})),n.d(t,"Repeat",(function(){return er})),n.d(t,"is",(function(){return Z})),n.d(t,"fromJS",(function(){return tr})),n.d(t,"hash",(function(){return re})),n.d(t,"isImmutable",(function(){return w})),n.d(t,"isCollection",(function(){return h})),n.d(t,"isKeyed",(function(){return m})),n.d(t,"isIndexed",(function(){return g})),n.d(t,"isAssociative",(function(){return y})),n.d(t,"isOrdered",(function(){return _})),n.d(t,"isValueObject",(function(){return X})),n.d(t,"get",(function(){return We})),n.d(t,"getIn",(function(){return kn})),n.d(t,"has",(function(){return He})),n.d(t,"hasIn",(function(){return Tn})),n.d(t,"merge",(function(){return at})),n.d(t,"mergeDeep",(function(){return ut})),n.d(t,"mergeWith",(function(){return st})),n.d(t,"mergeDeepWith",(function(){return ct})),n.d(t,"remove",(function(){return Ke})),n.d(t,"removeIn",(function(){return Xe})),n.d(t,"set",(function(){return Je})),n.d(t,"setIn",(function(){return Ye})),n.d(t,"update",(function(){return et})),n.d(t,"updateIn",(function(){return Qe}));var r={};function i(e){e&&(e.value=!0)}function o(){}function a(e){return void 0===e.size&&(e.size=e.__iterate(u)),e.size}function s(e,t){if("number"!=typeof t){var n=t>>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?a(e)+t:t}function u(){return!0}function c(e,t,n){return(0===e&&!d(e)||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function l(e,t){return f(e,t,0)}function p(e,t){return f(e,t,t)}function f(e,t,n){return void 0===e?n:d(e)?t===1/0?t:0|Math.max(0,t+e):void 0===t||t===e?e:0|Math.min(t,e)}function d(e){return e<0||0===e&&1/e==-1/0}function h(e){return Boolean(e&&e["@@__IMMUTABLE_ITERABLE__@@"])}function m(e){return Boolean(e&&e["@@__IMMUTABLE_KEYED__@@"])}function g(e){return Boolean(e&&e["@@__IMMUTABLE_INDEXED__@@"])}function y(e){return m(e)||g(e)}var v=function(e){return h(e)?e:R(e)},b=function(e){function t(e){return m(e)?e:B(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(v),E=function(e){function t(e){return g(e)?e:U(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(v),x=function(e){function t(e){return h(e)&&!y(e)?e:z(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(v);v.Keyed=b,v.Indexed=E,v.Set=x;function D(e){return Boolean(e&&e["@@__IMMUTABLE_SEQ__@@"])}function C(e){return Boolean(e&&e["@@__IMMUTABLE_RECORD__@@"])}function w(e){return h(e)||C(e)}var S="@@__IMMUTABLE_ORDERED__@@";function _(e){return Boolean(e&&e[S])}var k="function"==typeof Symbol&&Symbol.iterator,A=k||"@@iterator",T=function(e){this.next=e};function O(e,t,n,r){var i=0===e?t:1===e?n:[t,n];return r?r.value=i:r={value:i,done:!1},r}function F(){return{value:void 0,done:!0}}function N(e){return!!j(e)}function I(e){return e&&"function"==typeof e.next}function M(e){var t=j(e);return t&&t.call(e)}function j(e){var t=e&&(k&&e[k]||e["@@iterator"]);if("function"==typeof t)return t}T.prototype.toString=function(){return"[Iterator]"},T.KEYS=0,T.VALUES=1,T.ENTRIES=2,T.prototype.inspect=T.prototype.toSource=function(){return this.toString()},T.prototype[A]=function(){return this};var L=Object.prototype.hasOwnProperty;function P(e){return!(!Array.isArray(e)&&"string"!=typeof e)||e&&"object"==typeof e&&Number.isInteger(e.length)&&e.length>=0&&(0===e.length?1===Object.keys(e).length:e.hasOwnProperty(e.length-1))}var R=function(e){function t(e){return null==e?G():w(e)?e.toSeq():function(e){var t=Q(e);if(t)return t;if("object"==typeof e)return new q(e);throw new TypeError("Expected Array or collection object of values, or keyed object: "+e)}(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toSeq=function(){return this},t.prototype.toString=function(){return this.__toString("Seq {","}")},t.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},t.prototype.__iterate=function(e,t){var n=this._cache;if(n){for(var r=n.length,i=0;i!==r;){var o=n[t?r-++i:i++];if(!1===e(o[1],o[0],this))break}return i}return this.__iterateUncached(e,t)},t.prototype.__iterator=function(e,t){var n=this._cache;if(n){var r=n.length,i=0;return new T((function(){if(i===r)return{value:void 0,done:!0};var o=n[t?r-++i:i++];return O(e,o[0],o[1])}))}return this.__iteratorUncached(e,t)},t}(v),B=function(e){function t(e){return null==e?G().toKeyedSeq():h(e)?m(e)?e.toSeq():e.fromEntrySeq():C(e)?e.toSeq():K(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toKeyedSeq=function(){return this},t}(R),U=function(e){function t(e){return null==e?G():h(e)?m(e)?e.entrySeq():e.toIndexedSeq():C(e)?e.toSeq().entrySeq():J(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return t(arguments)},t.prototype.toIndexedSeq=function(){return this},t.prototype.toString=function(){return this.__toString("Seq [","]")},t}(R),z=function(e){function t(e){return(h(e)&&!y(e)?e:U(e)).toSetSeq()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return t(arguments)},t.prototype.toSetSeq=function(){return this},t}(R);R.isSeq=D,R.Keyed=B,R.Set=z,R.Indexed=U,R.prototype["@@__IMMUTABLE_SEQ__@@"]=!0;var V=function(e){function t(e){this._array=e,this.size=e.length}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.get=function(e,t){return this.has(e)?this._array[s(this,e)]:t},t.prototype.__iterate=function(e,t){for(var n=this._array,r=n.length,i=0;i!==r;){var o=t?r-++i:i++;if(!1===e(n[o],o,this))break}return i},t.prototype.__iterator=function(e,t){var n=this._array,r=n.length,i=0;return new T((function(){if(i===r)return{value:void 0,done:!0};var o=t?r-++i:i++;return O(e,o,n[o])}))},t}(U),q=function(e){function t(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},t.prototype.has=function(e){return L.call(this._object,e)},t.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,i=r.length,o=0;o!==i;){var a=r[t?i-++o:o++];if(!1===e(n[a],a,this))break}return o},t.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,i=r.length,o=0;return new T((function(){if(o===i)return{value:void 0,done:!0};var a=r[t?i-++o:o++];return O(e,a,n[a])}))},t}(B);q.prototype[S]=!0;var H,W=function(e){function t(e){this._collection=e,this.size=e.length||e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=M(this._collection),r=0;if(I(n))for(var i;!(i=n.next()).done&&!1!==e(i.value,r++,this););return r},t.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=M(this._collection);if(!I(n))return new T(F);var r=0;return new T((function(){var t=n.next();return t.done?t:O(e,r++,t.value)}))},t}(U);function G(){return H||(H=new V([]))}function K(e){var t=Array.isArray(e)?new V(e):N(e)?new W(e):void 0;if(t)return t.fromEntrySeq();if("object"==typeof e)return new q(e);throw new TypeError("Expected Array or collection object of [k, v] entries, or keyed object: "+e)}function J(e){var t=Q(e);if(t)return t;throw new TypeError("Expected Array or collection object of values: "+e)}function Q(e){return P(e)?new V(e):N(e)?new W(e):void 0}function Y(e){return Boolean(e&&e["@@__IMMUTABLE_MAP__@@"])}function $(e){return Y(e)&&_(e)}function X(e){return Boolean(e&&"function"==typeof e.equals&&"function"==typeof e.hashCode)}function Z(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!!(X(e)&&X(t)&&e.equals(t))}var ee="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function te(e){return e>>>1&1073741824|3221225471&e}var ne=Object.prototype.valueOf;function re(e){switch(typeof e){case"boolean":return e?1108378657:1108378656;case"number":return function(e){if(e!=e||e===1/0)return 0;var t=0|e;t!==e&&(t^=4294967295*e);for(;e>4294967295;)t^=e/=4294967295;return te(t)}(e);case"string":return e.length>pe?function(e){var t=he[e];void 0===t&&(t=ie(e),de===fe&&(de=0,he={}),de++,he[e]=t);return t}(e):ie(e);case"object":case"function":return null===e?1108378658:"function"==typeof e.hashCode?te(e.hashCode(e)):(e.valueOf!==ne&&"function"==typeof e.valueOf&&(e=e.valueOf(e)),function(e){var t;if(ue&&void 0!==(t=se.get(e)))return t;if(void 0!==(t=e[le]))return t;if(!ae){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[le]))return t;if(void 0!==(t=function(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}(e)))return t}t=++ce,1073741824&ce&&(ce=0);if(ue)se.set(e,t);else{if(void 0!==oe&&!1===oe(e))throw new Error("Non-extensible objects are not allowed as keys.");if(ae)Object.defineProperty(e,le,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[le]=t;else{if(void 0===e.nodeType)throw new Error("Unable to set a non-enumerable property on object.");e[le]=t}}return t}(e));case"undefined":return 1108378659;default:if("function"==typeof e.toString)return ie(e.toString());throw new Error("Value type "+typeof e+" cannot be hashed.")}}function ie(e){for(var t=0,n=0;n=0&&(d.get=function(t,n){return(t=s(this,t))>=0&&tu)return{value:void 0,done:!0};var e=i.next();return r||1===t||e.done?e:O(t,s-1,0===t?void 0:e.value[1],e)}))},d}function we(e,t,n,r){var i=Me(e);return i.__iterateUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterate(i,o);var s=!0,u=0;return e.__iterate((function(e,o,c){if(!s||!(s=t.call(n,e,o,c)))return u++,i(e,r?o:u-1,a)})),u},i.__iteratorUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterator(i,o);var s=e.__iterator(2,o),u=!0,c=0;return new T((function(){var e,o,l;do{if((e=s.next()).done)return r||1===i?e:O(i,c++,0===i?void 0:e.value[1],e);var p=e.value;o=p[0],l=p[1],u&&(u=t.call(n,l,o,a))}while(u);return 2===i?e:O(i,o,l,e)}))},i}function Se(e,t){var n=m(e),r=[e].concat(t).map((function(e){return h(e)?n&&(e=b(e)):e=n?K(e):J(Array.isArray(e)?e:[e]),e})).filter((function(e){return 0!==e.size}));if(0===r.length)return e;if(1===r.length){var i=r[0];if(i===e||n&&m(i)||g(e)&&g(i))return i}var o=new V(r);return n?o=o.toKeyedSeq():g(e)||(o=o.toSetSeq()),(o=o.flatten(!0)).size=r.reduce((function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}}),0),o}function _e(e,t,n){var r=Me(e);return r.__iterateUncached=function(i,o){if(o)return this.cacheResult().__iterate(i,o);var a=0,s=!1;return function e(u,c){u.__iterate((function(o,u){return(!t||c0}function Oe(e,t,n,r){var i=Me(e),o=new V(n).map((function(e){return e.size}));return i.size=r?o.max():o.min(),i.__iterate=function(e,t){for(var n,r=this.__iterator(1,t),i=0;!(n=r.next()).done&&!1!==e(n.value,i++,this););return i},i.__iteratorUncached=function(e,i){var o=n.map((function(e){return e=v(e),M(i?e.reverse():e)})),a=0,s=!1;return new T((function(){var n;return s||(n=o.map((function(e){return e.next()})),s=r?n.every((function(e){return e.done})):n.some((function(e){return e.done}))),s?{value:void 0,done:!0}:O(e,a++,t.apply(null,n.map((function(e){return e.value}))))}))},i}function Fe(e,t){return e===t?e:D(e)?t:e.constructor(t)}function Ne(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function Ie(e){return m(e)?b:g(e)?E:x}function Me(e){return Object.create((m(e)?B:g(e)?U:z).prototype)}function je(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):R.prototype.cacheResult.call(this)}function Le(e,t){return void 0===e&&void 0===t?0:void 0===e?1:void 0===t?-1:e>t?1:e0;)t[n]=arguments[n+1];if("function"!=typeof e)throw new TypeError("Invalid merger function: "+e);return ot(this,t,e)}function ot(e,t,n){for(var i=[],o=0;o0;)t[n]=arguments[n+1];return pt(e,t)}function st(e,t){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];return pt(t,n,e)}function ut(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return lt(e,t)}function ct(e,t){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];return lt(t,n,e)}function lt(e,t,n){return pt(e,t,function(e){return function t(n,r,i){return Ve(n)&&Ve(r)?pt(n,[r],t):e?e(n,r,i):r}}(n))}function pt(e,t,n){if(!Ve(e))throw new TypeError("Cannot merge into non-data-structure value: "+e);if(w(e))return"function"==typeof n&&e.mergeWith?e.mergeWith.apply(e,[n].concat(t)):e.merge?e.merge.apply(e,t):e.concat.apply(e,t);for(var r=Array.isArray(e),i=e,o=r?E:b,a=r?function(t){i===e&&(i=Ge(i)),i.push(t)}:function(t,r){var o=L.call(i,r),a=o&&n?n(i[r],t,r):t;o&&a===i[r]||(i===e&&(i=Ge(i)),i[r]=a)},s=0;s0;)t[n]=arguments[n+1];return lt(this,t,e)}function ht(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return Qe(this,e,Nt(),(function(e){return pt(e,t)}))}function mt(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return Qe(this,e,Nt(),(function(e){return lt(e,t)}))}function gt(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this}function yt(){return this.__ownerID?this:this.__ensureOwner(new o)}function vt(){return this.__ensureOwner()}function bt(){return this.__altered}ge.prototype.cacheResult=me.prototype.cacheResult=ye.prototype.cacheResult=ve.prototype.cacheResult=je;var Et=function(e){function t(t){return null==t?Nt():Y(t)&&!_(t)?t:Nt().withMutations((function(n){var r=e(t);Be(r.size),r.forEach((function(e,t){return n.set(t,e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return Nt().withMutations((function(t){for(var n=0;n=e.length)throw new Error("Missing value for key: "+e[n]);t.set(e[n],e[n+1])}}))},t.prototype.toString=function(){return this.__toString("Map {","}")},t.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},t.prototype.set=function(e,t){return It(this,e,t)},t.prototype.remove=function(e){return It(this,e,r)},t.prototype.deleteAll=function(e){var t=v(e);return 0===t.size?this:this.withMutations((function(e){t.forEach((function(t){return e.remove(t)}))}))},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):Nt()},t.prototype.sort=function(e){return rn(ke(this,e))},t.prototype.sortBy=function(e,t){return rn(ke(this,t,e))},t.prototype.map=function(e,t){return this.withMutations((function(n){n.forEach((function(r,i){n.set(i,e.call(t,r,i,n))}))}))},t.prototype.__iterator=function(e,t){return new At(this,e,t)},t.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate((function(t){return r++,e(t[1],t[0],n)}),t),r},t.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Ft(this.size,this._root,e,this.__hash):0===this.size?Nt():(this.__ownerID=e,this.__altered=!1,this)},t}(b);Et.isMap=Y;var xt=Et.prototype;xt["@@__IMMUTABLE_MAP__@@"]=!0,xt.delete=xt.remove,xt.removeAll=xt.deleteAll,xt.setIn=$e,xt.removeIn=xt.deleteIn=Ze,xt.update=tt,xt.updateIn=nt,xt.merge=xt.concat=rt,xt.mergeWith=it,xt.mergeDeep=ft,xt.mergeDeepWith=dt,xt.mergeIn=ht,xt.mergeDeepIn=mt,xt.withMutations=gt,xt.wasAltered=bt,xt.asImmutable=vt,xt["@@transducer/init"]=xt.asMutable=yt,xt["@@transducer/step"]=function(e,t){return e.set(t[0],t[1])},xt["@@transducer/result"]=function(e){return e.asImmutable()};var Dt=function(e,t){this.ownerID=e,this.entries=t};Dt.prototype.get=function(e,t,n,r){for(var i=this.entries,o=0,a=i.length;o=Bt)return function(e,t,n,r){e||(e=new o);for(var i=new _t(e,re(n),[n,r]),a=0;a>>e)),o=this.bitmap;return 0==(o&i)?r:this.nodes[Pt(o&i-1)].get(e+5,t,n,r)},Ct.prototype.update=function(e,t,n,i,o,a,s){void 0===n&&(n=re(i));var u=31&(0===t?n:n>>>t),c=1<=Ut)return function(e,t,n,r,i){for(var o=0,a=new Array(32),s=0;0!==n;s++,n>>>=1)a[s]=1&n?t[o++]:void 0;return a[r]=i,new wt(e,o+1,a)}(e,d,l,u,m);if(p&&!m&&2===d.length&&jt(d[1^f]))return d[1^f];if(p&&m&&1===d.length&&jt(m))return m;var g=e&&e===this.ownerID,y=p?m?l:l^c:l|c,v=p?m?Rt(d,f,m,g):function(e,t,n){var r=e.length-1;if(n&&t===r)return e.pop(),e;for(var i=new Array(r),o=0,a=0;a>>e),o=this.nodes[i];return o?o.get(e+5,t,n,r):r},wt.prototype.update=function(e,t,n,i,o,a,s){void 0===n&&(n=re(i));var u=31&(0===t?n:n>>>t),c=o===r,l=this.nodes,p=l[u];if(c&&!p)return this;var f=Mt(p,e,t+5,n,i,o,a,s);if(f===p)return this;var d=this.count;if(p){if(!f&&--d>>n),s=31&(0===n?r:r>>>n),u=a===s?[Lt(e,t,n+5,r,i)]:(o=new _t(t,r,i),a>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function Rt(e,t,n,r){var i=r?e:Pe(e);return i[t]=n,i}var Bt=8,Ut=16,zt=8;function Vt(e){return Boolean(e&&e["@@__IMMUTABLE_LIST__@@"])}var qt=function(e){function t(t){var n=Yt();if(null==t)return n;if(Vt(t))return t;var r=e(t),i=r.size;return 0===i?n:(Be(i),i>0&&i<32?Qt(0,i,5,null,new Wt(r.toArray())):n.withMutations((function(e){e.setSize(i),r.forEach((function(t,n){return e.set(n,t)}))})))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.prototype.toString=function(){return this.__toString("List [","]")},t.prototype.get=function(e,t){if((e=s(this,e))>=0&&e=e.size||t<0)return e.withMutations((function(e){t<0?en(e,t).set(0,n):en(e,0,t+1).set(t,n)}));t+=e._origin;var r=e._tail,i=e._root,o={value:!1};t>=tn(e._capacity)?r=$t(r,e.__ownerID,0,t,n,o):i=$t(i,e.__ownerID,e._level,t,n,o);if(!o.value)return e;if(e.__ownerID)return e._root=i,e._tail=r,e.__hash=void 0,e.__altered=!0,e;return Qt(e._origin,e._capacity,e._level,i,r)}(this,e,t)},t.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},t.prototype.insert=function(e,t){return this.splice(e,0,t)},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=5,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Yt()},t.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations((function(n){en(n,0,t+e.length);for(var r=0;r>>t&31;if(r>=this.array.length)return new Wt([],e);var i,o=0===r;if(t>0){var a=this.array[r];if((i=a&&a.removeBefore(e,t-5,n))===a&&o)return this}if(o&&!i)return this;var s=Xt(this,e);if(!o)for(var u=0;u>>t&31;if(i>=this.array.length)return this;if(t>0){var o=this.array[i];if((r=o&&o.removeAfter(e,t-5,n))===o&&i===this.array.length-1)return this}var a=Xt(this,e);return a.array.splice(i+1),r&&(a.array[i]=r),a};var Gt,Kt={};function Jt(e,t){var n=e._origin,r=e._capacity,i=tn(r),o=e._tail;return a(e._root,e._level,0);function a(e,s,u){return 0===s?function(e,a){var s=a===i?o&&o.array:e&&e.array,u=a>n?0:n-a,c=r-a;c>32&&(c=32);return function(){if(u===c)return Kt;var e=t?--c:u++;return s&&s[e]}}(e,u):function(e,i,o){var s,u=e&&e.array,c=o>n?0:n-o>>i,l=1+(r-o>>i);l>32&&(l=32);return function(){for(;;){if(s){var e=s();if(e!==Kt)return e;s=null}if(c===l)return Kt;var n=t?--l:c++;s=a(u&&u[n],i-5,o+(n<>>n&31,c=e&&u0){var l=e&&e.array[u],p=$t(l,t,n-5,r,o,a);return p===l?e:((s=Xt(e,t)).array[u]=p,s)}return c&&e.array[u]===o?e:(a&&i(a),s=Xt(e,t),void 0===o&&u===s.array.length-1?s.array.pop():s.array[u]=o,s)}function Xt(e,t){return t&&e&&t===e.ownerID?e:new Wt(e?e.array.slice():[],t)}function Zt(e,t){if(t>=tn(e._capacity))return e._tail;if(t<1<0;)n=n.array[t>>>r&31],r-=5;return n}}function en(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new o,i=e._origin,a=e._capacity,s=i+t,u=void 0===n?a:n<0?a+n:i+n;if(s===i&&u===a)return e;if(s>=u)return e.clear();for(var c=e._level,l=e._root,p=0;s+p<0;)l=new Wt(l&&l.array.length?[void 0,l]:[],r),p+=1<<(c+=5);p&&(s+=p,i+=p,u+=p,a+=p);for(var f=tn(a),d=tn(u);d>=1<f?new Wt([],r):h;if(h&&d>f&&s5;y-=5){var v=f>>>y&31;g=g.array[v]=Xt(g.array[v],r)}g.array[f>>>5&31]=h}if(u=d)s-=d,u-=d,c=5,l=null,m=m&&m.removeBefore(r,0,s);else if(s>i||d>>c&31;if(b!==d>>>c&31)break;b&&(p+=(1<i&&(l=l.removeBefore(r,c,s-p)),l&&d>>5<<5}var nn,rn=function(e){function t(e){return null==e?an():$(e)?e:an().withMutations((function(t){var n=b(e);Be(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.prototype.toString=function(){return this.__toString("OrderedMap {","}")},t.prototype.get=function(e,t){var n=this._map.get(e);return void 0!==n?this._list.get(n)[1]:t},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):an()},t.prototype.set=function(e,t){return sn(this,e,t)},t.prototype.remove=function(e){return sn(this,e,r)},t.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},t.prototype.__iterate=function(e,t){var n=this;return this._list.__iterate((function(t){return t&&e(t[1],t[0],n)}),t)},t.prototype.__iterator=function(e,t){return this._list.fromEntrySeq().__iterator(e,t)},t.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e),n=this._list.__ensureOwner(e);return e?on(t,n,e,this.__hash):0===this.size?an():(this.__ownerID=e,this._map=t,this._list=n,this)},t}(Et);function on(e,t,n,r){var i=Object.create(rn.prototype);return i.size=e?e.size:0,i._map=e,i._list=t,i.__ownerID=n,i.__hash=r,i}function an(){return nn||(nn=on(Nt(),Yt()))}function sn(e,t,n){var i,o,a=e._map,s=e._list,u=a.get(t),c=void 0!==u;if(n===r){if(!c)return e;s.size>=32&&s.size>=2*a.size?(i=(o=s.filter((function(e,t){return void 0!==e&&u!==t}))).toKeyedSeq().map((function(e){return e[0]})).flip().toMap(),e.__ownerID&&(i.__ownerID=o.__ownerID=e.__ownerID)):(i=a.remove(t),o=u===s.size-1?s.pop():s.set(u,void 0))}else if(c){if(n===s.get(u)[1])return e;i=a,o=s.set(u,[t,n])}else i=a.set(t,s.size),o=s.set(s.size,[t,n]);return e.__ownerID?(e.size=i.size,e._map=i,e._list=o,e.__hash=void 0,e):on(i,o)}rn.isOrderedMap=$,rn.prototype[S]=!0,rn.prototype.delete=rn.prototype.remove;function un(e){return Boolean(e&&e["@@__IMMUTABLE_STACK__@@"])}var cn=function(e){function t(e){return null==e?dn():un(e)?e:dn().pushAll(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.prototype.toString=function(){return this.__toString("Stack [","]")},t.prototype.get=function(e,t){var n=this._head;for(e=s(this,e);n&&e--;)n=n.next;return n?n.value:t},t.prototype.peek=function(){return this._head&&this._head.value},t.prototype.push=function(){var e=arguments;if(0===arguments.length)return this;for(var t=this.size+arguments.length,n=this._head,r=arguments.length-1;r>=0;r--)n={value:e[r],next:n};return this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):fn(t,n)},t.prototype.pushAll=function(t){if(0===(t=e(t)).size)return this;if(0===this.size&&un(t))return t;Be(t.size);var n=this.size,r=this._head;return t.__iterate((function(e){n++,r={value:e,next:r}}),!0),this.__ownerID?(this.size=n,this._head=r,this.__hash=void 0,this.__altered=!0,this):fn(n,r)},t.prototype.pop=function(){return this.slice(1)},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):dn()},t.prototype.slice=function(t,n){if(c(t,n,this.size))return this;var r=l(t,this.size);if(p(n,this.size)!==this.size)return e.prototype.slice.call(this,t,n);for(var i=this.size-r,o=this._head;r--;)o=o.next;return this.__ownerID?(this.size=i,this._head=o,this.__hash=void 0,this.__altered=!0,this):fn(i,o)},t.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?fn(this.size,this._head,e,this.__hash):0===this.size?dn():(this.__ownerID=e,this.__altered=!1,this)},t.prototype.__iterate=function(e,t){var n=this;if(t)return new V(this.toArray()).__iterate((function(t,r){return e(t,r,n)}),t);for(var r=0,i=this._head;i&&!1!==e(i.value,r++,this);)i=i.next;return r},t.prototype.__iterator=function(e,t){if(t)return new V(this.toArray()).__iterator(e,t);var n=0,r=this._head;return new T((function(){if(r){var t=r.value;return r=r.next,O(e,n++,t)}return{value:void 0,done:!0}}))},t}(E);cn.isStack=un;var ln,pn=cn.prototype;function fn(e,t,n,r){var i=Object.create(pn);return i.size=e,i._head=t,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function dn(){return ln||(ln=fn(0))}pn["@@__IMMUTABLE_STACK__@@"]=!0,pn.shift=pn.pop,pn.unshift=pn.push,pn.unshiftAll=pn.pushAll,pn.withMutations=gt,pn.wasAltered=bt,pn.asImmutable=vt,pn["@@transducer/init"]=pn.asMutable=yt,pn["@@transducer/step"]=function(e,t){return e.unshift(t)},pn["@@transducer/result"]=function(e){return e.asImmutable()};function hn(e){return Boolean(e&&e["@@__IMMUTABLE_SET__@@"])}function mn(e){return hn(e)&&_(e)}function gn(e,t){if(e===t)return!0;if(!h(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||m(e)!==m(t)||g(e)!==g(t)||_(e)!==_(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!y(e);if(_(e)){var i=e.entries();return t.every((function(e,t){var r=i.next().value;return r&&Z(r[1],e)&&(n||Z(r[0],t))}))&&i.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var a=e;e=t,t=a}var s=!0,u=t.__iterate((function(t,i){if(n?!e.has(t):o?!Z(t,e.get(i,r)):!Z(e.get(i,r),t))return s=!1,!1}));return s&&e.size===u}function yn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}function vn(e){if(!e||"object"!=typeof e)return e;if(!h(e)){if(!Ve(e))return e;e=R(e)}if(m(e)){var t={};return e.__iterate((function(e,n){t[n]=vn(e)})),t}var n=[];return e.__iterate((function(e){n.push(vn(e))})),n}var bn=function(e){function t(t){return null==t?wn():hn(t)&&!_(t)?t:wn().withMutations((function(n){var r=e(t);Be(r.size),r.forEach((function(e){return n.add(e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.fromKeys=function(e){return this(b(e).keySeq())},t.intersect=function(e){return(e=v(e).toArray()).length?xn.intersect.apply(t(e.pop()),e):wn()},t.union=function(e){return(e=v(e).toArray()).length?xn.union.apply(t(e.pop()),e):wn()},t.prototype.toString=function(){return this.__toString("Set {","}")},t.prototype.has=function(e){return this._map.has(e)},t.prototype.add=function(e){return Dn(this,this._map.set(e,e))},t.prototype.remove=function(e){return Dn(this,this._map.remove(e))},t.prototype.clear=function(){return Dn(this,this._map.clear())},t.prototype.map=function(e,t){var n=this,r=[],i=[];return this.forEach((function(o){var a=e.call(t,o,o,n);a!==o&&(r.push(o),i.push(a))})),this.withMutations((function(e){r.forEach((function(t){return e.remove(t)})),i.forEach((function(t){return e.add(t)}))}))},t.prototype.union=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return 0===(t=t.filter((function(e){return 0!==e.size}))).length?this:0!==this.size||this.__ownerID||1!==t.length?this.withMutations((function(n){for(var r=0;r=0&&t=0&&n>>-15,461845907),t=ee(t<<13|t>>>-13,5),t=ee((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=te((t=ee(t^t>>>13,3266489909))^t>>>16)}(e.__iterate(n?t?function(e,t){r=31*r+zn(re(e),re(t))|0}:function(e,t){r=r+zn(re(e),re(t))|0}:t?function(e){r=31*r+re(e)|0}:function(e){r=r+re(e)|0}),r)}(this))}});var Fn=v.prototype;Fn["@@__IMMUTABLE_ITERABLE__@@"]=!0,Fn[A]=Fn.values,Fn.toJSON=Fn.toArray,Fn.__toStringMapper=qe,Fn.inspect=Fn.toSource=function(){return this.toString()},Fn.chain=Fn.flatMap,Fn.contains=Fn.includes,yn(b,{flip:function(){return Fe(this,be(this))},mapEntries:function(e,t){var n=this,r=0;return Fe(this,this.toSeq().map((function(i,o){return e.call(t,[o,i],r++,n)})).fromEntrySeq())},mapKeys:function(e,t){var n=this;return Fe(this,this.toSeq().flip().map((function(r,i){return e.call(t,r,i,n)})).flip())}});var Nn=b.prototype;Nn["@@__IMMUTABLE_KEYED__@@"]=!0,Nn[A]=Fn.entries,Nn.toJSON=On,Nn.__toStringMapper=function(e,t){return qe(t)+": "+qe(e)},yn(E,{toKeyedSeq:function(){return new me(this,!1)},filter:function(e,t){return Fe(this,De(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return Fe(this,xe(this,!1))},slice:function(e,t){return Fe(this,Ce(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(t||0,0),0===n||2===n&&!t)return this;e=l(e,e<0?this.count():this.size);var r=this.slice(0,e);return Fe(this,1===n?r:r.concat(Pe(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(e){return this.get(0,e)},flatten:function(e){return Fe(this,_e(this,e,!1))},get:function(e,t){return(e=s(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find((function(t,n){return n===e}),void 0,t)},has:function(e){return(e=s(this,e))>=0&&(void 0!==this.size?this.size===1/0||et?-1:0}function zn(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}In["@@__IMMUTABLE_INDEXED__@@"]=!0,In[S]=!0,yn(x,{get:function(e,t){return this.has(e)?e:t},includes:function(e){return this.has(e)},keySeq:function(){return this.valueSeq()}}),x.prototype.has=Fn.includes,x.prototype.contains=x.prototype.includes,yn(B,b.prototype),yn(U,E.prototype),yn(z,x.prototype);var Vn=function(e){function t(e){return null==e?Gn():mn(e)?e:Gn().withMutations((function(t){var n=x(e);Be(n.size),n.forEach((function(e){return t.add(e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.fromKeys=function(e){return this(b(e).keySeq())},t.prototype.toString=function(){return this.__toString("OrderedSet {","}")},t}(bn);Vn.isOrderedSet=mn;var qn,Hn=Vn.prototype;function Wn(e,t){var n=Object.create(Hn);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function Gn(){return qn||(qn=Wn(an()))}Hn[S]=!0,Hn.zip=In.zip,Hn.zipWith=In.zipWith,Hn.__empty=Gn,Hn.__make=Wn;var Kn=function(e,t){var n,r=function(o){var a=this;if(o instanceof r)return o;if(!(this instanceof r))return new r(o);if(!n){n=!0;var s=Object.keys(e),u=i._indices={};i._name=t,i._keys=s,i._defaultValues=e;for(var c=0;c2?[]:void 0,{"":e})}function nr(e,t){return m(t)?t.toMap():t.toList()}var rr="4.0.0-rc.11",ir={version:rr,Collection:v,Iterable:v,Seq:R,Map:Et,OrderedMap:rn,List:qt,Stack:cn,Set:bn,OrderedSet:Vn,Record:Kn,Range:_n,Repeat:er,is:Z,fromJS:tr,hash:re,isImmutable:w,isCollection:h,isKeyed:m,isIndexed:g,isAssociative:y,isOrdered:_,isValueObject:X,isSeq:D,isList:Vt,isMap:Y,isOrderedMap:$,isStack:un,isSet:hn,isOrderedSet:mn,isRecord:C,get:We,getIn:kn,has:He,hasIn:Tn,merge:at,mergeDeep:ut,mergeWith:st,mergeDeepWith:ct,remove:Ke,removeIn:Xe,set:Je,setIn:Ye,update:et,updateIn:Qe},or=v;t.default=ir},function(e,t,n){"use strict";var r=n(91),i=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],o=["scalar","sequence","mapping"];e.exports=function(e,t){var n,a;if(t=t||{},Object.keys(t).forEach((function(t){if(-1===i.indexOf(t))throw new r('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=(n=t.styleAliases||null,a={},null!==n&&Object.keys(n).forEach((function(e){n[e].forEach((function(t){a[String(t)]=e}))})),a),-1===o.indexOf(this.kind))throw new r('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}},function(e,t,n){"use strict";function r(e,t){return e.reduce((function(e,n){return e[t(n)]=n,e}),Object.create(null))}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0});var i=n(48);function o(e,t){return function(n){var r;return(r={})[e]=n||t,r}}t.editQuery=(r=i.createActions({EDIT_QUERY:function(e){return{query:e}},EDIT_HEADERS:o("headers"),EDIT_ENDPOINT:o("endpoint"),EDIT_VARIABLES:o("variables"),SET_OPERATION_NAME:o("operationName"),SET_VARIABLE_TO_TYPE:o("variableToType"),SET_OPERATIONS:o("operations"),SET_EDITOR_FLEX:o("editorFlex"),EDIT_NAME:o("name"),OPEN_QUERY_VARIABLES:function(){return{queryVariablesActive:!0}},CLOSE_QUERY_VARIABLES:function(){return{queryVariablesActive:!1}},SET_VARIABLE_EDITOR_HEIGHT:o("variableEditorHeight"),SET_RESPONSE_TRACING_HEIGHT:o("responceTracingHeight"),SET_TRACING_SUPPORTED:o("tracingSupported"),SET_SUBSCRIPTION_ACTIVE:o("subscriptionActive"),SET_QUERY_TYPES:o("queryTypes"),SET_RESPONSE_EXTENSIONS:o("responseExtensions"),SET_CURRENT_QUERY_START_TIME:o("currentQueryStartTime"),SET_CURRENT_QUERY_END_TIME:o("currentQueryEndTime"),UPDATE_QUERY_FACTS:o(),PRETTIFY_QUERY:o(),INJECT_HEADERS:function(e,t){return{headers:e,endpoint:t}},CLOSE_TRACING:o("responseTracingHeight"),OPEN_TRACING:o("responseTracingHeight"),TOGGLE_TRACING:o(),CLOSE_VARIABLES:o("variableEditorHeight"),OPEN_VARIABLES:o("variableEditorHeight"),TOGGLE_VARIABLES:o(),ADD_RESPONSE:function(e,t,n){return{workspaceId:e,sessionId:t,response:n}},SET_RESPONSE:function(e,t,n){return{workspaceId:e,sessionId:t,response:n}},CLEAR_RESPONSES:o(),FETCH_SCHEMA:o(),REFETCH_SCHEMA:o(),SET_ENDPOINT_UNREACHABLE:o("endpoint"),SET_SCROLL_TOP:function(e,t){return{sessionId:e,scrollTop:t}},SCHEMA_FETCHING_SUCCESS:function(e,t,n){return{endpoint:e,tracingSupported:t,isPollingSchema:n}},SCHEMA_FETCHING_ERROR:function(e,t){return{endpoint:e,error:t}},RENEW_STACKS:o(),RUN_QUERY:function(e){return{operationName:e}},QUERY_SUCCESS:o(),QUERY_ERROR:o(),RUN_QUERY_AT_POSITION:function(e){return{position:e}},START_QUERY:o("queryRunning",!0),STOP_QUERY:function(e,t){return{workspaceId:t,sessionId:e}},OPEN_SETTINGS_TAB:function(){return{}},OPEN_CONFIG_TAB:function(){return{}},NEW_SESSION:function(e,t){return{endpoint:e,reuseHeaders:t}},NEW_SESSION_FROM_QUERY:function(e){return{query:e}},NEW_FILE_TAB:function(e,t,n){return{fileName:e,filePath:t,file:n}},DUPLICATE_SESSION:o("session"),CLOSE_SELECTED_TAB:function(){return{}},SELECT_NEXT_TAB:function(){return{}},SELECT_PREV_TAB:function(){return{}},SELECT_TAB:o("sessionId"),SELECT_TAB_INDEX:o("index"),CLOSE_TAB:o("sessionId"),REORDER_TABS:function(e,t){return{src:e,dest:t}},EDIT_SETTINGS:o(),SAVE_SETTINGS:o(),EDIT_CONFIG:o(),SAVE_CONFIG:o(),EDIT_FILE:o(),SAVE_FILE:o()})).editQuery,t.editVariables=r.editVariables,t.setOperationName=r.setOperationName,t.editHeaders=r.editHeaders,t.editEndpoint=r.editEndpoint,t.setVariableToType=r.setVariableToType,t.setOperations=r.setOperations,t.startQuery=r.startQuery,t.stopQuery=r.stopQuery,t.setEditorFlex=r.setEditorFlex,t.openQueryVariables=r.openQueryVariables,t.closeQueryVariables=r.closeQueryVariables,t.setVariableEditorHeight=r.setVariableEditorHeight,t.setResponseTracingHeight=r.setResponseTracingHeight,t.setTracingSupported=r.setTracingSupported,t.closeTracing=r.closeTracing,t.openTracing=r.openTracing,t.closeVariables=r.closeVariables,t.openVariables=r.openVariables,t.addResponse=r.addResponse,t.setResponse=r.setResponse,t.clearResponses=r.clearResponses,t.openSettingsTab=r.openSettingsTab,t.schemaFetchingSuccess=r.schemaFetchingSuccess,t.schemaFetchingError=r.schemaFetchingError,t.setEndpointUnreachable=r.setEndpointUnreachable,t.renewStacks=r.renewStacks,t.runQuery=r.runQuery,t.prettifyQuery=r.prettifyQuery,t.fetchSchema=r.fetchSchema,t.updateQueryFacts=r.updateQueryFacts,t.runQueryAtPosition=r.runQueryAtPosition,t.toggleTracing=r.toggleTracing,t.toggleVariables=r.toggleVariables,t.newSession=r.newSession,t.newSessionFromQuery=r.newSessionFromQuery,t.newFileTab=r.newFileTab,t.closeTab=r.closeTab,t.closeSelectedTab=r.closeSelectedTab,t.editSettings=r.editSettings,t.saveSettings=r.saveSettings,t.editConfig=r.editConfig,t.saveConfig=r.saveConfig,t.editFile=r.editFile,t.saveFile=r.saveFile,t.selectTab=r.selectTab,t.selectTabIndex=r.selectTabIndex,t.selectNextTab=r.selectNextTab,t.selectPrevTab=r.selectPrevTab,t.duplicateSession=r.duplicateSession,t.querySuccess=r.querySuccess,t.queryError=r.queryError,t.setSubscriptionActive=r.setSubscriptionActive,t.setQueryTypes=r.setQueryTypes,t.injectHeaders=r.injectHeaders,t.openConfigTab=r.openConfigTab,t.editName=r.editName,t.setResponseExtensions=r.setResponseExtensions,t.setCurrentQueryStartTime=r.setCurrentQueryStartTime,t.setCurrentQueryEndTime=r.setCurrentQueryEndTime,t.refetchSchema=r.refetchSchema,t.setScrollTop=r.setScrollTop,t.reorderTabs=r.reorderTabs},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));function r(e,t){var n="string"==typeof e?[e,t]:[void 0,e],r=n[0],i=" Did you mean ";r&&(i+=r+" ");var o=n[1].map((function(e){return'"'.concat(e,'"')}));switch(o.length){case 0:return"";case 1:return i+o[0]+"?";case 2:return i+o[0]+" or "+o[1]+"?"}var a=o.slice(0,5),s=a.pop();return i+a.join(", ")+", or "+s+"?"}},function(e,t,n){"use strict";var r=n(208),i=n.n(r).a;t.a=i},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(54);function i(e){if(null===Object.getPrototypeOf(e))return e;for(var t=Object.create(null),n=0,i=Object(r.a)(e);nt)){for(var c=this._rows,l=0;l<=u;l++)c[0][l]=l;for(var p=1;p<=s;p++){for(var f=c[(p-1)%3],d=c[p%3],h=d[0]=p,m=1;m<=u;m++){var g=r[p-1]===i[m-1]?0:1,y=Math.min(f[m]+1,d[m-1]+1,f[m-1]+g);if(p>1&&m>1&&r[p-1]===i[m-2]&&r[p-2]===i[m-1]){var v=c[(p-2)%3][m-2];y=Math.min(y,v+1)}yt)return}var b=c[s%3][u];return b<=t?b:void 0}},e}();function o(e){for(var t=e.length,n=new Array(t),r=0;r1?n-1:0),i=1;i1?t-1:0),r=1;r2?n-2:0),a=2;a0&&a(t[0]);)t.shift();for(;t.length>0&&a(t[t.length-1]);)t.pop();return t.join("\n")}function i(e){for(var t=null,n=1;n1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=-1===e.indexOf("\n"),i=" "===e[0]||"\t"===e[0],o='"'===e[e.length-1],a="\\"===e[e.length-1],s=!r||o||a||n,u="";return!s||r&&i||(u+="\n"+t),u+=t?e.replace(/\n/g,"\n"+t):e,s&&(u+="\n"),'"""'+u.replace(/"""/g,'\\"""')+'"""'}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return s}))},function(e,t,n){"use strict";n.d(t,"c",(function(){return g})),n.d(t,"b",(function(){return y})),n.d(t,"a",(function(){return v}));var r=n(55),i=n(57),o=n(14),a=n(25),s=n(4),u=n(40),c=n(8),l=n(47),p=n(31),f=n(12),d=n(21),h=n(0);function m(e,t){for(var n=0;n9999999)throw new TypeError("Near-infinite iteration.");return s}var c=e.length;if("number"==typeof c&&c>=0&&c%1==0){for(var l=[],p=0;p + * @license MIT + */function i(e,t){if(e===t)return 0;for(var n=e.length,r=t.length,i=0,o=Math.min(n,r);i=0;c--)if(l[c]!==p[c])return!1;for(c=l.length-1;c>=0;c--)if(s=l[c],!b(e[s],t[s],n,r))return!1;return!0}(e,t,n,r))}return n?e===t:e==t}function E(e){return"[object Arguments]"==Object.prototype.toString.call(e)}function x(e,t){if(!e||!t)return!1;if("[object RegExp]"==Object.prototype.toString.call(t))return t.test(e);try{if(e instanceof t)return!0}catch(e){}return!Error.isPrototypeOf(t)&&!0===t.call({},e)}function D(e,t,n,r){var i;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof n&&(r=n,n=null),i=function(e){var t;try{e()}catch(e){t=e}return t}(t),r=(n&&n.name?" ("+n.name+").":".")+(r?" "+r:"."),e&&!i&&y(i,n,"Missing expected exception"+r);var o="string"==typeof r,s=!e&&i&&!n;if((!e&&a.isError(i)&&o&&x(i,n)||s)&&y(i,n,"Got unwanted exception"+r),e&&i&&n&&!x(i,n)||!e&&i)throw i}f.AssertionError=function(e){this.name="AssertionError",this.actual=e.actual,this.expected=e.expected,this.operator=e.operator,e.message?(this.message=e.message,this.generatedMessage=!1):(this.message=function(e){return m(g(e.actual),128)+" "+e.operator+" "+m(g(e.expected),128)}(this),this.generatedMessage=!0);var t=e.stackStartFunction||y;if(Error.captureStackTrace)Error.captureStackTrace(this,t);else{var n=new Error;if(n.stack){var r=n.stack,i=h(t),o=r.indexOf("\n"+i);if(o>=0){var a=r.indexOf("\n",o+1);r=r.substring(a+1)}this.stack=r}}},a.inherits(f.AssertionError,Error),f.fail=y,f.ok=v,f.equal=function(e,t,n){e!=t&&y(e,t,n,"==",f.equal)},f.notEqual=function(e,t,n){e==t&&y(e,t,n,"!=",f.notEqual)},f.deepEqual=function(e,t,n){b(e,t,!1)||y(e,t,n,"deepEqual",f.deepEqual)},f.deepStrictEqual=function(e,t,n){b(e,t,!0)||y(e,t,n,"deepStrictEqual",f.deepStrictEqual)},f.notDeepEqual=function(e,t,n){b(e,t,!1)&&y(e,t,n,"notDeepEqual",f.notDeepEqual)},f.notDeepStrictEqual=function e(t,n,r){b(t,n,!0)&&y(t,n,r,"notDeepStrictEqual",e)},f.strictEqual=function(e,t,n){e!==t&&y(e,t,n,"===",f.strictEqual)},f.notStrictEqual=function(e,t,n){e===t&&y(e,t,n,"!==",f.notStrictEqual)},f.throws=function(e,t,n){D(!0,e,t,n)},f.doesNotThrow=function(e,t,n){D(!1,e,t,n)},f.ifError=function(e){if(e)throw e},f.strict=r((function e(t,n){t||y(t,!0,n,"==",e)}),f,{equal:f.strictEqual,deepEqual:f.deepStrictEqual,notEqual:f.notStrictEqual,notDeepEqual:f.notDeepStrictEqual}),f.strict.strict=f.strict;var C=Object.keys||function(e){var t=[];for(var n in e)s.call(e,n)&&t.push(n);return t}}).call(this,n(42))},function(e,t,n){"use strict";function r(){return(r=Object.assign||function(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:u.a,l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:new s.a(e),p=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{maxErrors:void 0};t||Object(r.a)(0,"Must provide document."),Object(a.a)(e);var f=Object.freeze({}),d=[],h=new c.b(e,t,l,(function(e){if(null!=p.maxErrors&&d.length>=p.maxErrors)throw d.push(new i.a("Too many validation errors, error limit reached. Validation aborted.")),f;d.push(e)})),m=Object(o.d)(n.map((function(e){return e(h)})));try{Object(o.c)(t,Object(s.b)(l,m))}catch(e){if(e!==f)throw e}return d}function p(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.b,r=[],i=new c.a(e,t,(function(e){r.push(e)})),a=n.map((function(e){return e(i)}));return Object(o.c)(e,Object(o.d)(a)),r}function f(e){var t=p(e);if(0!==t.length)throw new Error(t.map((function(e){return e.message})).join("\n\n"))}function d(e,t){var n=p(e,t);if(0!==n.length)throw new Error(n.map((function(e){return e.message})).join("\n\n"))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var r=n(71),i=n(57),o=n(14),a=n(4),s=n(18),u=n(31),c=n(80),l=n(1),p=n(13),f=n(0);function d(e,t){if(Object(f.L)(t)){var n=d(e,t.ofType);return(null==n?void 0:n.kind)===l.a.NULL?null:n}if(null===e)return{kind:l.a.NULL};if(void 0===e)return null;if(Object(f.J)(t)){var m=t.ofType;if(Object(c.a)(e)){for(var g=[],y=0,v=Object(i.a)(e);y