kandi background
Explore Kits

kylin | Extreme OLAP Engine for Big Data

 by   apache Java Version: Current License: Apache-2.0

 by   apache Java Version: Current License: Apache-2.0

Download this library from

kandi X-RAY | kylin Summary

kylin is a Java library typically used in Big Data, Spark applications. kylin has no bugs, it has build file available, it has a Permissive License and it has high support. However kylin has 11 vulnerabilities. You can download it from GitHub, Maven.
[![Build Status](https://travis-ci.org/apache/kylin.svg?branch=master)](https://travis-ci.org/apache/kylin) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [![Coverage Status](https://coveralls.io/repos/github/apache/kylin/badge.svg?branch=master)](https://coveralls.io/github/apache/kylin?branch=master) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/74f0139786cd4e8a8ce69bb0c17c2e71)](https://www.codacy.com/app/kyligence-git/kylin?utm_source=github.com&utm_medium=referral&utm_content=apache/kylin&utm_campaign=Badge_Grade) [![Quality Gate](https://sonarcloud.io/api/project_badges/quality_gate?project=org.apache.kylin%3Akylin)](https://sonarcloud.io/dashboard/index/org.apache.kylin%3Akylin) [![SonarCloud Coverage](https://sonarcloud.io/api/project_badges/measure?project=org.apache.kylin%3Akylin&metric=coverage)](https://sonarcloud.io/component_measures/metric/coverage/list?id=org.apache.kylin%3Akylin) [![SonarCloud Bugs](https://sonarcloud.io/api/project_badges/measure?project=org.apache.kylin%3Akylin&metric=bugs)](https://sonarcloud.io/component_measures/metric/reliability_rating/list?id=org.apache.kylin%3Akylin) [![SonarCloud Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=org.apache.kylin%3Akylin&metric=vulnerabilities)](https://sonarcloud.io/component_measures/metric/security_rating/list?id=org.apache.kylin%3Akylin). Apache Kylin is an open source Distributed Analytics Engine, contributed by eBay Inc., it provides a SQL interface and multi-dimensional analysis (OLAP) on Hadoop with support for extremely large datasets. For more details, see the website [http://kylin.apache.org](http://kylin.apache.org), Chinese version:[http://kylin.apache.org/cn/](http://kylin.apache.org/cn/). In order to allow users to try Kylin easily, we provide a docker image for Kylin. Just run the following commands in your terminal. After 3~5 mins, you can access Kylin WebUI http://127.0.0.1:7070/kylin/login in your browser. You can learn more about this docker image on Kylin’s [website](http://kylin.apache.org/docs40/install/kylin_docker.html).
Support
Support
Quality
Quality
Security
Security
License
License
Reuse
Reuse

kandi-support Support

  • kylin has a highly active ecosystem.
  • It has 3276 star(s) with 1453 fork(s). There are 269 watchers for this library.
  • It had no major release in the last 12 months.
  • kylin has no issues reported. There are 49 open pull requests and 0 closed requests.
  • It has a positive sentiment in the developer community.
  • The latest version of kylin is current.
kylin Support
Best in #Java
Average in #Java
kylin Support
Best in #Java
Average in #Java

quality kandi Quality

  • kylin has 0 bugs and 0 code smells.
kylin Quality
Best in #Java
Average in #Java
kylin Quality
Best in #Java
Average in #Java

securitySecurity

  • kylin has 11 vulnerability issues reported (4 critical, 5 high, 2 medium, 0 low).
  • kylin code analysis shows 0 unresolved vulnerabilities.
  • There are 0 security hotspots that need review.
kylin Security
Best in #Java
Average in #Java
kylin Security
Best in #Java
Average in #Java

license License

  • kylin is licensed under the Apache-2.0 License. This license is Permissive.
  • Permissive licenses have the least restrictions, and you can use them in most projects.
kylin License
Best in #Java
Average in #Java
kylin License
Best in #Java
Average in #Java

buildReuse

  • kylin releases are not available. You will need to build from source code and install.
  • Deployable package is available in Maven.
  • Build file is available. You can build the component from source.
  • Installation instructions are not available. Examples and code snippets are available.
  • kylin saves you 247062 person hours of effort in developing the same functionality from scratch.
  • It has 259636 lines of code, 21161 functions and 2657 files.
  • It has medium code complexity. Code complexity directly impacts maintainability of the code.
kylin Reuse
Best in #Java
Average in #Java
kylin Reuse
Best in #Java
Average in #Java
Top functions reviewed by kandi - BETA

kandi has reviewed kylin and discovered the below as its top functions. This is intended to give you an instant insight into kylin implemented functionality, and help decide if they suit your requirements.

  • Merges the fragments and stores the cuboid data .
  • Perform re - assign without commit .
  • Run the expected size iterator .
  • Reassign assignment .
  • Create a record writer .
  • Returns a human readable error message for the given OLAP context .
  • Validate the Cube
  • Extracts the column meta data from the ResultSetMetaData .
  • Builds the aggregations .
  • Extract task details

kylin Key Features

pull docker image

start the container

default

copy iconCopydownload iconDownload
docker pull apachekylin/apache-kylin-standalone:4.0.0

Could not load database driver: KylinEngineSpec

copy iconCopydownload iconDownload
bootstrapScript: |
  #!/bin/bash
  rm -rf /var/lib/apt/lists/* && \
  pip install \
    kylinpy \
    psycopg2==2.8.5 \
    redis==3.2.1 && \
  if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi
helm upgrade --install --values my-values.yaml <release-name> superset/superset
helm upgrade --values my-values.yaml <release-name> superset/superset
root@superset-868c768599-24xc2:/app# pip list | grep kylinpy
kylinpy                2.8.4
helm install --set additionalRequirements={kylinpy} <release-name> superset/superset
helm upgrade --set additionalRequirements={kylinpy} <release-name> superset/superset
USER-SUPPLIED VALUES:
additionalRequirements:
- kylinpy
-----------------------
bootstrapScript: |
  #!/bin/bash
  rm -rf /var/lib/apt/lists/* && \
  pip install \
    kylinpy \
    psycopg2==2.8.5 \
    redis==3.2.1 && \
  if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi
helm upgrade --install --values my-values.yaml <release-name> superset/superset
helm upgrade --values my-values.yaml <release-name> superset/superset
root@superset-868c768599-24xc2:/app# pip list | grep kylinpy
kylinpy                2.8.4
helm install --set additionalRequirements={kylinpy} <release-name> superset/superset
helm upgrade --set additionalRequirements={kylinpy} <release-name> superset/superset
USER-SUPPLIED VALUES:
additionalRequirements:
- kylinpy
-----------------------
bootstrapScript: |
  #!/bin/bash
  rm -rf /var/lib/apt/lists/* && \
  pip install \
    kylinpy \
    psycopg2==2.8.5 \
    redis==3.2.1 && \
  if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi
helm upgrade --install --values my-values.yaml <release-name> superset/superset
helm upgrade --values my-values.yaml <release-name> superset/superset
root@superset-868c768599-24xc2:/app# pip list | grep kylinpy
kylinpy                2.8.4
helm install --set additionalRequirements={kylinpy} <release-name> superset/superset
helm upgrade --set additionalRequirements={kylinpy} <release-name> superset/superset
USER-SUPPLIED VALUES:
additionalRequirements:
- kylinpy
-----------------------
bootstrapScript: |
  #!/bin/bash
  rm -rf /var/lib/apt/lists/* && \
  pip install \
    kylinpy \
    psycopg2==2.8.5 \
    redis==3.2.1 && \
  if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi
helm upgrade --install --values my-values.yaml <release-name> superset/superset
helm upgrade --values my-values.yaml <release-name> superset/superset
root@superset-868c768599-24xc2:/app# pip list | grep kylinpy
kylinpy                2.8.4
helm install --set additionalRequirements={kylinpy} <release-name> superset/superset
helm upgrade --set additionalRequirements={kylinpy} <release-name> superset/superset
USER-SUPPLIED VALUES:
additionalRequirements:
- kylinpy
-----------------------
bootstrapScript: |
  #!/bin/bash
  rm -rf /var/lib/apt/lists/* && \
  pip install \
    kylinpy \
    psycopg2==2.8.5 \
    redis==3.2.1 && \
  if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi
helm upgrade --install --values my-values.yaml <release-name> superset/superset
helm upgrade --values my-values.yaml <release-name> superset/superset
root@superset-868c768599-24xc2:/app# pip list | grep kylinpy
kylinpy                2.8.4
helm install --set additionalRequirements={kylinpy} <release-name> superset/superset
helm upgrade --set additionalRequirements={kylinpy} <release-name> superset/superset
USER-SUPPLIED VALUES:
additionalRequirements:
- kylinpy
-----------------------
bootstrapScript: |
  #!/bin/bash
  rm -rf /var/lib/apt/lists/* && \
  pip install \
    kylinpy \
    psycopg2==2.8.5 \
    redis==3.2.1 && \
  if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi
helm upgrade --install --values my-values.yaml <release-name> superset/superset
helm upgrade --values my-values.yaml <release-name> superset/superset
root@superset-868c768599-24xc2:/app# pip list | grep kylinpy
kylinpy                2.8.4
helm install --set additionalRequirements={kylinpy} <release-name> superset/superset
helm upgrade --set additionalRequirements={kylinpy} <release-name> superset/superset
USER-SUPPLIED VALUES:
additionalRequirements:
- kylinpy
-----------------------
bootstrapScript: |
  #!/bin/bash
  rm -rf /var/lib/apt/lists/* && \
  pip install \
    kylinpy \
    psycopg2==2.8.5 \
    redis==3.2.1 && \
  if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi
helm upgrade --install --values my-values.yaml <release-name> superset/superset
helm upgrade --values my-values.yaml <release-name> superset/superset
root@superset-868c768599-24xc2:/app# pip list | grep kylinpy
kylinpy                2.8.4
helm install --set additionalRequirements={kylinpy} <release-name> superset/superset
helm upgrade --set additionalRequirements={kylinpy} <release-name> superset/superset
USER-SUPPLIED VALUES:
additionalRequirements:
- kylinpy

Update to mapred-default.xml not visible in web UI configuration

copy iconCopydownload iconDownload
<property>
 <name>mapreduce.map.memory.mb</name>
 <value>1024</value>
</property>

Copy particular XML document element to Another XML document using shell commands

copy iconCopydownload iconDownload
xmlstarlet sel -t -c "/configuration/property[name='hbase.zookeeper.quorum']" input.xml
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>ip-nn-nn-nn-nn.ec2.internal</value>
</property>
sudo apt-get -y install xmlstarlet
xmlstarlet ed -a "/configuration/property[last()]" -t elem -n property \
-v "$(xmlstarlet sel -t -c "/configuration/property[name='hbase.zookeeper.quorum']/*" input.xml)" \
target.xml | xmlstarlet unesc | xmlstarlet fo > new_target.xml
<?xml version="1.0"?>
<configuration>
  <property>
    <name>mapreduce.job.split.metainfo.maxsize</name>
    <value>-1</value>
    <description>The maximum permissible size of the split metainfo file.
            The JobTracker won't attempt to read split metainfo files bigger than
            the configured value. No limits if set to -1.
        </description>
  </property>
  <property>
    <name>mapreduce.map.output.compress</name>
    <value>true</value>
    <description>Compress map outputs</description>
  </property>

  ...

  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>ip-nn-nn-nn-nn.ec2.internal</value>
  </property>
</configuration>
-----------------------
xmlstarlet sel -t -c "/configuration/property[name='hbase.zookeeper.quorum']" input.xml
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>ip-nn-nn-nn-nn.ec2.internal</value>
</property>
sudo apt-get -y install xmlstarlet
xmlstarlet ed -a "/configuration/property[last()]" -t elem -n property \
-v "$(xmlstarlet sel -t -c "/configuration/property[name='hbase.zookeeper.quorum']/*" input.xml)" \
target.xml | xmlstarlet unesc | xmlstarlet fo > new_target.xml
<?xml version="1.0"?>
<configuration>
  <property>
    <name>mapreduce.job.split.metainfo.maxsize</name>
    <value>-1</value>
    <description>The maximum permissible size of the split metainfo file.
            The JobTracker won't attempt to read split metainfo files bigger than
            the configured value. No limits if set to -1.
        </description>
  </property>
  <property>
    <name>mapreduce.map.output.compress</name>
    <value>true</value>
    <description>Compress map outputs</description>
  </property>

  ...

  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>ip-nn-nn-nn-nn.ec2.internal</value>
  </property>
</configuration>
-----------------------
xmlstarlet sel -t -c "/configuration/property[name='hbase.zookeeper.quorum']" input.xml
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>ip-nn-nn-nn-nn.ec2.internal</value>
</property>
sudo apt-get -y install xmlstarlet
xmlstarlet ed -a "/configuration/property[last()]" -t elem -n property \
-v "$(xmlstarlet sel -t -c "/configuration/property[name='hbase.zookeeper.quorum']/*" input.xml)" \
target.xml | xmlstarlet unesc | xmlstarlet fo > new_target.xml
<?xml version="1.0"?>
<configuration>
  <property>
    <name>mapreduce.job.split.metainfo.maxsize</name>
    <value>-1</value>
    <description>The maximum permissible size of the split metainfo file.
            The JobTracker won't attempt to read split metainfo files bigger than
            the configured value. No limits if set to -1.
        </description>
  </property>
  <property>
    <name>mapreduce.map.output.compress</name>
    <value>true</value>
    <description>Compress map outputs</description>
  </property>

  ...

  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>ip-nn-nn-nn-nn.ec2.internal</value>
  </property>
</configuration>
-----------------------
xmlstarlet sel -t -c "/configuration/property[name='hbase.zookeeper.quorum']" input.xml
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>ip-nn-nn-nn-nn.ec2.internal</value>
</property>
sudo apt-get -y install xmlstarlet
xmlstarlet ed -a "/configuration/property[last()]" -t elem -n property \
-v "$(xmlstarlet sel -t -c "/configuration/property[name='hbase.zookeeper.quorum']/*" input.xml)" \
target.xml | xmlstarlet unesc | xmlstarlet fo > new_target.xml
<?xml version="1.0"?>
<configuration>
  <property>
    <name>mapreduce.job.split.metainfo.maxsize</name>
    <value>-1</value>
    <description>The maximum permissible size of the split metainfo file.
            The JobTracker won't attempt to read split metainfo files bigger than
            the configured value. No limits if set to -1.
        </description>
  </property>
  <property>
    <name>mapreduce.map.output.compress</name>
    <value>true</value>
    <description>Compress map outputs</description>
  </property>

  ...

  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>ip-nn-nn-nn-nn.ec2.internal</value>
  </property>
</configuration>
-----------------------
xmlstarlet sel -t -c "/configuration/property[name='hbase.zookeeper.quorum']" input.xml
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>ip-nn-nn-nn-nn.ec2.internal</value>
</property>
sudo apt-get -y install xmlstarlet
xmlstarlet ed -a "/configuration/property[last()]" -t elem -n property \
-v "$(xmlstarlet sel -t -c "/configuration/property[name='hbase.zookeeper.quorum']/*" input.xml)" \
target.xml | xmlstarlet unesc | xmlstarlet fo > new_target.xml
<?xml version="1.0"?>
<configuration>
  <property>
    <name>mapreduce.job.split.metainfo.maxsize</name>
    <value>-1</value>
    <description>The maximum permissible size of the split metainfo file.
            The JobTracker won't attempt to read split metainfo files bigger than
            the configured value. No limits if set to -1.
        </description>
  </property>
  <property>
    <name>mapreduce.map.output.compress</name>
    <value>true</value>
    <description>Compress map outputs</description>
  </property>

  ...

  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>ip-nn-nn-nn-nn.ec2.internal</value>
  </property>
</configuration>

sed command to find and replace string with special characters to a string in command line

copy iconCopydownload iconDownload
sed -i "s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g" /usr/local/kylin/kylin.properties
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx
sed -i "0,/root.*dfs/{s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g}" /usr/local/kylin/kylin.properties
-----------------------
sed -i "s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g" /usr/local/kylin/kylin.properties
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx
sed -i "0,/root.*dfs/{s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g}" /usr/local/kylin/kylin.properties
-----------------------
sed -i "s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g" /usr/local/kylin/kylin.properties
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx
sed -i "0,/root.*dfs/{s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g}" /usr/local/kylin/kylin.properties
-----------------------
$ cat tst.awk
BEGIN {
    map["root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*'"] = "hadoop"
    map["localhost"] = "ip-00-00-00-000.ec2.internal"
}
{
    for (str in map) {
        if ( s = index($0,str) ) {
            $0 = substr($0,1,s-1) map[str] substr($0,s+length(str))
        }
    }
    print
}

$ awk -f tst.awk file
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx

Community Discussions

Trending Discussions on kylin
  • Could not load database driver: KylinEngineSpec
  • Kubernetes Host and Service Ingress Mapping using TCP
  • Update to mapred-default.xml not visible in web UI configuration
  • Copy particular XML document element to Another XML document using shell commands
  • sed command to find and replace string with special characters to a string in command line
Trending Discussions on kylin

QUESTION

Could not load database driver: KylinEngineSpec

Asked 2021-Oct-29 at 21:21

Just install Apache Superset within Kubernetes. Already have a working Apache Kylin Cluster in the same Kubernetes Cluster. While trying to connect Kylin within Superset i get the following error message:

ERROR: Could not load database driver: KylinEngineSpec

Superset is installed using this repo:

helm repo add superset https://apache.github.io/superset

The connection string which is used:

kylin://<username>:<password>@<hostname>:<port>/<project name>

Any ideas?

ANSWER

Answered 2021-Aug-20 at 10:36

By default superset comes with no KylinEngineSpec driver installed. You need to provide it as an additional requirement at install.

Recommended driver for Apache Kylin is kylinpy [reference].

Update

The documentation is a bit misleading. Specifying additional packages in additionalRequiremets does not properly install them. Instead you have to add those to bootstrapScript.
Create a file with overrides (in my case it will be my-values.yaml), add below to this file

bootstrapScript: |
  #!/bin/bash
  rm -rf /var/lib/apt/lists/* && \
  pip install \
    kylinpy \
    psycopg2==2.8.5 \
    redis==3.2.1 && \
  if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi

Rembember, this will override bootstrapScript not add to it
Then, to install superset with new values

helm upgrade --install --values my-values.yaml <release-name> superset/superset

Replace <release-name> witho your desired name
or upgrade, if you already have superset installed

helm upgrade --values my-values.yaml <release-name> superset/superset

Again replace <release-name> with your release name
Then, after execing into a pod, you can see kylinpy was installed

root@superset-868c768599-24xc2:/app# pip list | grep kylinpy
kylinpy                2.8.4

To install it specify additionalRequirements with --set flag [reference]

helm install --set additionalRequirements={kylinpy} <release-name> superset/superset

replace <release-name> with your desired name

If you already have superset installed, you can perform an upgrade:

helm upgrade --set additionalRequirements={kylinpy} <release-name> superset/superset

Again, replace <release-name> with your release name

Use helm get values to see whether that new setting took effect. You should see something like

USER-SUPPLIED VALUES:
additionalRequirements:
- kylinpy

I strongly recommend going through official docs about running superset in Kubernetes. There are a lot more settings to change other than database drivers.

Source https://stackoverflow.com/questions/68830218

Community Discussions, Code Snippets contain sources that include Stack Exchange Network

Vulnerabilities

Apache Kylin 2.0.0, 2.1.0, 2.2.0, 2.3.0, 2.3.1, 2.3.2, 2.4.0, 2.4.1, 2.5.0, 2.5.1, 2.5.2, 2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.6.6, 3.0.0-alpha, 3.0.0-alpha2, 3.0.0-beta, 3.0.0, 3.0.1, 3.0.2, 3.1.0, 4.0.0-alpha has one restful api which exposed Kylin's configuration information without any authentication, so it is dangerous because some confidential information entries will be disclosed to everyone.
Similar to CVE-2020-1956, Kylin has one more restful API which concatenates the API inputs into OS commands and then executes them on the server; while the reported API misses necessary input validation, which causes the hackers to have the possibility to execute OS command remotely. Users of all previous versions after 2.3 should upgrade to 3.1.0.
Kylin concatenates and executes a Hive SQL in Hive CLI or beeline when building a new segment; some part of the HQL is from system configurations, while the configuration can be overwritten by certain rest api, which makes SQL injection attack is possible. Users of all previous versions after 2.0 should upgrade to 3.1.0.
Apache Kylin 2.3.0, and releases up to 2.6.5 and 3.0.1 has some restful apis which will concatenate os command with the user input string, a user is likely to be able to execute any os command without any protection or validation.
Kylin has some restful apis which will concatenate SQLs with the user input string, a user is likely to be able to run malicious database queries.

Install kylin

You can download it from GitHub, Maven.
You can use kylin like any standard Java library. Please include the the jar files in your classpath. You can also use any IDE and you can run and debug the kylin component as you would do with any other Java program. Best practice is to use a build tool that supports dependency management such as Maven or Gradle. For Maven installation, please refer maven.apache.org. For Gradle installation, please refer gradle.org .

Support

Please refer to [http://kylin.apache.org/docs40/](http://kylin.apache.org/docs40/). Please refer to [LICENSE](https://github.com/apache/kylin/blob/master/LICENSE) file.

DOWNLOAD this Library from

Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from
over 430 million Knowledge Items
Find more libraries
Reuse Solution Kits and Libraries Curated by Popular Use Cases

Save this library and start creating your kit

Explore Related Topics

Share this Page

share link
Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from
over 430 million Knowledge Items
Find more libraries
Reuse Solution Kits and Libraries Curated by Popular Use Cases

Save this library and start creating your kit

  • © 2022 Open Weaver Inc.