diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1d52342
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,96 @@
+NetBirdSDK.xcframework/
+Netbird.xcframework/
+GoogleService-Info*.plist
+.DS_Store
+xcuserdata/
+
+# Xcode
+#
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## User settings
+xcuserdata/
+
+## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
+*.xcscmblueprint
+*.xccheckout
+
+## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
+build/
+DerivedData/
+*.moved-aside
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+
+## Obj-C/Swift specific
+*.hmap
+
+## App packaging
+*.ipa
+*.dSYM.zip
+*.dSYM
+
+## Playgrounds
+timeline.xctimeline
+playground.xcworkspace
+
+# Swift Package Manager
+#
+# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
+# Packages/
+# Package.pins
+# Package.resolved
+# *.xcodeproj
+#
+# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
+# hence it is not needed unless you have added a package configuration file to your project
+# .swiftpm
+
+.build/
+
+# CocoaPods
+#
+# We recommend against adding the Pods directory to your .gitignore. However
+# you should judge for yourself, the pros and cons are mentioned at:
+# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
+#
+# Pods/
+#
+# Add this line if you want to avoid checking in source code from the Xcode workspace
+# *.xcworkspace
+
+# Carthage
+#
+# Add this line if you want to avoid checking in source code from Carthage dependencies.
+# Carthage/Checkouts
+
+Carthage/Build/
+
+# Accio dependency management
+Dependencies/
+.accio/
+
+# fastlane
+#
+# It is recommended to not store the screenshots in the git repo.
+# Instead, use fastlane to re-generate the screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://docs.fastlane.tools/best-practices/source-control/#source-control
+
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots/**/*.png
+fastlane/test_output
+
+# Code Injection
+#
+# After new code Injection tools there's a generated folder /iOSInjectionProject
+# https://github.com/johnno1962/injectionforxcode
+
+iOSInjectionProject/
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..b4a1a61
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,132 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, caste, color, religion, or sexual
+identity and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the overall
+ community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or advances of
+ any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email address,
+ without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders 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, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+community@netbird.io.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series of
+actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or permanent
+ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within the
+community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.1, available at
+[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
+
+Community Impact Guidelines were inspired by
+[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
+
+For answers to common questions about this code of conduct, see the FAQ at
+[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
+[https://www.contributor-covenant.org/translations][translations].
+
+[homepage]: https://www.contributor-covenant.org
+[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f1972fb
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright © 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {one line to give the program's name and a brief idea of what it does.}
+ Copyright © {year} {name of author}
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the license, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ {project} Copyright © {year} {fullname}
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/NetBird-Bridging-Header.h b/NetBird-Bridging-Header.h
new file mode 100644
index 0000000..df5d602
--- /dev/null
+++ b/NetBird-Bridging-Header.h
@@ -0,0 +1,7 @@
+//
+// Use this file to import your target's public headers that you would like to expose to Swift.
+//
+
+
+#import
+#import "WireGuardKitC/WireGuardKitC.h"
diff --git a/NetBird.xcodeproj/project.pbxproj b/NetBird.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..52cad03
--- /dev/null
+++ b/NetBird.xcodeproj/project.pbxproj
@@ -0,0 +1,977 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 56;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 50003BBC2AFBCA6B00E5EB6B /* FirebasePerformance in Frameworks */ = {isa = PBXBuildFile; productRef = 50003BBB2AFBCA6B00E5EB6B /* FirebasePerformance */; };
+ 50003BBE2AFBCA7900E5EB6B /* FirebasePerformance in Frameworks */ = {isa = PBXBuildFile; productRef = 50003BBD2AFBCA7900E5EB6B /* FirebasePerformance */; };
+ 50003BC42AFBD7D500E5EB6B /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A562A80431C0034792B /* PacketTunnelProvider.swift */; };
+ 50003BC72AFBD7F200E5EB6B /* NetBirdAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C727EB2A824812006E898D /* NetBirdAdapter.swift */; };
+ 50003BCA2AFD2F5E00E5EB6B /* ConnectionListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50003BC82AFD2F0C00E5EB6B /* ConnectionListener.swift */; };
+ 50003BCC2AFD3B0C00E5EB6B /* ClientState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50003BCB2AFD3B0C00E5EB6B /* ClientState.swift */; };
+ 50003BCD2AFD3B2B00E5EB6B /* ClientState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50003BCB2AFD3B0C00E5EB6B /* ClientState.swift */; };
+ 50003BCE2AFD405600E5EB6B /* ConnectionListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50003BC82AFD2F0C00E5EB6B /* ConnectionListener.swift */; };
+ 50051DE02AE69A8100AFBDC4 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = 50051DDF2AE69A8100AFBDC4 /* FirebaseCrashlytics */; };
+ 501B0DCD2AE04DDE004BE7A7 /* button-disconnecting.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC52AE04DDE004BE7A7 /* button-disconnecting.json */; };
+ 501B0DCE2AE04DDE004BE7A7 /* button-disconnecting.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC52AE04DDE004BE7A7 /* button-disconnecting.json */; };
+ 501B0DCF2AE04DDE004BE7A7 /* button-connecting-loop.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC62AE04DDE004BE7A7 /* button-connecting-loop.json */; };
+ 501B0DD02AE04DDE004BE7A7 /* button-connecting-loop.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC62AE04DDE004BE7A7 /* button-connecting-loop.json */; };
+ 501B0DD12AE04DDE004BE7A7 /* logo_NetBird.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC72AE04DDE004BE7A7 /* logo_NetBird.json */; };
+ 501B0DD22AE04DDE004BE7A7 /* logo_NetBird.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC72AE04DDE004BE7A7 /* logo_NetBird.json */; };
+ 501B0DD32AE04DDE004BE7A7 /* loading.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC82AE04DDE004BE7A7 /* loading.json */; };
+ 501B0DD42AE04DDE004BE7A7 /* loading.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC82AE04DDE004BE7A7 /* loading.json */; };
+ 501B0DD52AE04DDE004BE7A7 /* button-start-connecting.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC92AE04DDE004BE7A7 /* button-start-connecting.json */; };
+ 501B0DD62AE04DDE004BE7A7 /* button-start-connecting.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC92AE04DDE004BE7A7 /* button-start-connecting.json */; };
+ 501B0DD72AE04DDE004BE7A7 /* button-full2.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCA2AE04DDE004BE7A7 /* button-full2.json */; };
+ 501B0DD82AE04DDE004BE7A7 /* button-full2.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCA2AE04DDE004BE7A7 /* button-full2.json */; };
+ 501B0DD92AE04DDE004BE7A7 /* button-full.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCB2AE04DDE004BE7A7 /* button-full.json */; };
+ 501B0DDA2AE04DDE004BE7A7 /* button-full.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCB2AE04DDE004BE7A7 /* button-full.json */; };
+ 501B0DDB2AE04DDE004BE7A7 /* button-connected.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCC2AE04DDE004BE7A7 /* button-connected.json */; };
+ 501B0DDC2AE04DDE004BE7A7 /* button-connected.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCC2AE04DDE004BE7A7 /* button-connected.json */; };
+ 501B0E012AE27ABA004BE7A7 /* NetBirdSDK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 501B0E002AE27ABA004BE7A7 /* NetBirdSDK.xcframework */; };
+ 50213A262A8D0A870031D993 /* NetworkChangeListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A2D2A7BDC470034792B /* NetworkChangeListener.swift */; };
+ 50213A2D2A8D0AA30031D993 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A292A7BDB590034792B /* Preferences.swift */; };
+ 50216D892ACB18EE009574C9 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A292A7BDB590034792B /* Preferences.swift */; };
+ 50216D8E2ACB1905009574C9 /* NetworkChangeListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A2D2A7BDC470034792B /* NetworkChangeListener.swift */; };
+ 50216D932ACB2488009574C9 /* NetworkExtensionAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50216D922ACB2488009574C9 /* NetworkExtensionAdapter.swift */; };
+ 502455BD2A79B0480034792B /* CustomBackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502455BC2A79B0480034792B /* CustomBackButton.swift */; };
+ 502455BF2A79B4500034792B /* SolidButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502455BE2A79B4500034792B /* SolidButton.swift */; };
+ 50245A1A2A7BCE890034792B /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 50245A192A7BCE830034792B /* libresolv.tbd */; };
+ 50245A542A80431B0034792B /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50245A532A80431B0034792B /* NetworkExtension.framework */; };
+ 50245A572A80431C0034792B /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A562A80431C0034792B /* PacketTunnelProvider.swift */; };
+ 50245A5C2A80431C0034792B /* NetbirdNetworkExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 50245A522A80431B0034792B /* NetbirdNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+ 505118CE2AD96ECA003027D3 /* x25519.c in Sources */ = {isa = PBXBuildFile; fileRef = 505118CA2AD96ECA003027D3 /* x25519.c */; };
+ 505118CF2AD96ECA003027D3 /* x25519.c in Sources */ = {isa = PBXBuildFile; fileRef = 505118CA2AD96ECA003027D3 /* x25519.c */; };
+ 505118D02AD96ECA003027D3 /* key.c in Sources */ = {isa = PBXBuildFile; fileRef = 505118CB2AD96ECA003027D3 /* key.c */; };
+ 505118D12AD96ECA003027D3 /* key.c in Sources */ = {isa = PBXBuildFile; fileRef = 505118CB2AD96ECA003027D3 /* key.c */; };
+ 5051190F2AE03F68003027D3 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 5051190E2AE03F68003027D3 /* FirebaseAnalytics */; };
+ 505119112AE03F68003027D3 /* FirebaseAnalyticsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 505119102AE03F68003027D3 /* FirebaseAnalyticsSwift */; };
+ 505119132AE03F68003027D3 /* FirebaseAppCheck in Frameworks */ = {isa = PBXBuildFile; productRef = 505119122AE03F68003027D3 /* FirebaseAppCheck */; };
+ 506331F82AF1676B00BC8F0E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 506331F72AF1676B00BC8F0E /* GoogleService-Info.plist */; };
+ 506331F92AF1676B00BC8F0E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 506331F72AF1676B00BC8F0E /* GoogleService-Info.plist */; };
+ 506331FB2AF52AB900BC8F0E /* CustomLottieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506331FA2AF52AB900BC8F0E /* CustomLottieView.swift */; };
+ 506331FE2AF53CFF00BC8F0E /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 506331FD2AF53CFF00BC8F0E /* Lottie */; };
+ 506332002AF9197700BC8F0E /* button-full2-dark.json in Resources */ = {isa = PBXBuildFile; fileRef = 506331FF2AF9197700BC8F0E /* button-full2-dark.json */; };
+ 506332022AF9415500BC8F0E /* CustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506332012AF9415500BC8F0E /* CustomTextField.swift */; };
+ 508BD8452AF04A990055E415 /* SafariView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508BD8442AF04A990055E415 /* SafariView.swift */; };
+ 508BD8472AF140D50055E415 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 508BD8462AF140D50055E415 /* FirebaseAnalytics */; };
+ 508BD8492AF140D50055E415 /* FirebaseAnalyticsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 508BD8482AF140D50055E415 /* FirebaseAnalyticsSwift */; };
+ 508BD84B2AF140D50055E415 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = 508BD84A2AF140D50055E415 /* FirebaseCrashlytics */; };
+ 50A8911B2A792A15007C48FC /* NetBirdApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A8911A2A792A15007C48FC /* NetBirdApp.swift */; };
+ 50A8911D2A792A15007C48FC /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A8911C2A792A15007C48FC /* MainView.swift */; };
+ 50A8911F2A792A16007C48FC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50A8911E2A792A16007C48FC /* Assets.xcassets */; };
+ 50C727ED2A824C10006E898D /* NetBirdAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C727EB2A824812006E898D /* NetBirdAdapter.swift */; };
+ 50C78AD12A82BBFD006E898D /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608022A7950CB00BAF09B /* Device.swift */; };
+ 50C78AEA2A82C858006E898D /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608022A7950CB00BAF09B /* Device.swift */; };
+ 50C78AFA2A82D036006E898D /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 50245A192A7BCE830034792B /* libresolv.tbd */; };
+ 50CD814F2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD814E2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift */; };
+ 50CD81502AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD814E2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift */; };
+ 50CD81622AD0595E00CF830B /* DNSManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81612AD0595E00CF830B /* DNSManager.swift */; };
+ 50CD81632AD0595E00CF830B /* DNSManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81612AD0595E00CF830B /* DNSManager.swift */; };
+ 50CD81A72AD5504B00CF830B /* StatusDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81A62AD5504B00CF830B /* StatusDetails.swift */; };
+ 50CD81A82AD5504B00CF830B /* StatusDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81A62AD5504B00CF830B /* StatusDetails.swift */; };
+ 50CD81B02AD5B94D00CF830B /* PeerCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81AF2AD5B94D00CF830B /* PeerCard.swift */; };
+ 50CD81B12AD5B94D00CF830B /* PeerCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81AF2AD5B94D00CF830B /* PeerCard.swift */; };
+ 50CD84362AD82F9400CF830B /* ServerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD84352AD82F9400CF830B /* ServerView.swift */; };
+ 50E608132A7958B100BAF09B /* MainViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608122A7958B100BAF09B /* MainViewModel.swift */; };
+ 50E608202A7979D600BAF09B /* SideDrawer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E6081F2A7979D600BAF09B /* SideDrawer.swift */; };
+ 50E608242A79966600BAF09B /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608232A79966600BAF09B /* AboutView.swift */; };
+ 50E608262A79968500BAF09B /* AdvancedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608252A79968500BAF09B /* AdvancedView.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 50245A5A2A80431C0034792B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 50A8910F2A792A15007C48FC /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 50245A512A80431B0034792B;
+ remoteInfo = NetbirdNetworkExtension;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 50245A602A80431C0034792B /* Embed Foundation Extensions */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 13;
+ files = (
+ 50245A5C2A80431C0034792B /* NetbirdNetworkExtension.appex in Embed Foundation Extensions */,
+ );
+ name = "Embed Foundation Extensions";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 50003BC82AFD2F0C00E5EB6B /* ConnectionListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionListener.swift; sourceTree = ""; };
+ 50003BCB2AFD3B0C00E5EB6B /* ClientState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientState.swift; sourceTree = ""; };
+ 501B0DC52AE04DDE004BE7A7 /* button-disconnecting.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-disconnecting.json"; sourceTree = ""; };
+ 501B0DC62AE04DDE004BE7A7 /* button-connecting-loop.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-connecting-loop.json"; sourceTree = ""; };
+ 501B0DC72AE04DDE004BE7A7 /* logo_NetBird.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = logo_NetBird.json; sourceTree = ""; };
+ 501B0DC82AE04DDE004BE7A7 /* loading.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = loading.json; sourceTree = ""; };
+ 501B0DC92AE04DDE004BE7A7 /* button-start-connecting.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-start-connecting.json"; sourceTree = ""; };
+ 501B0DCA2AE04DDE004BE7A7 /* button-full2.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-full2.json"; sourceTree = ""; };
+ 501B0DCB2AE04DDE004BE7A7 /* button-full.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-full.json"; sourceTree = ""; };
+ 501B0DCC2AE04DDE004BE7A7 /* button-connected.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-connected.json"; sourceTree = ""; };
+ 501B0E002AE27ABA004BE7A7 /* NetBirdSDK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = NetBirdSDK.xcframework; sourceTree = ""; };
+ 50216D922ACB2488009574C9 /* NetworkExtensionAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkExtensionAdapter.swift; sourceTree = ""; };
+ 502455BC2A79B0480034792B /* CustomBackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomBackButton.swift; sourceTree = ""; };
+ 502455BE2A79B4500034792B /* SolidButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SolidButton.swift; sourceTree = ""; };
+ 50245A0A2A7AA9390034792B /* NetBird-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NetBird-Bridging-Header.h"; sourceTree = ""; };
+ 50245A192A7BCE830034792B /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };
+ 50245A1B2A7BCF120034792B /* NetBird.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NetBird.entitlements; sourceTree = ""; };
+ 50245A292A7BDB590034792B /* Preferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = ""; };
+ 50245A2D2A7BDC470034792B /* NetworkChangeListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkChangeListener.swift; sourceTree = ""; };
+ 50245A3B2A7FD1CD0034792B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; };
+ 50245A522A80431B0034792B /* NetbirdNetworkExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NetbirdNetworkExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
+ 50245A532A80431B0034792B /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; };
+ 50245A562A80431C0034792B /* PacketTunnelProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelProvider.swift; sourceTree = ""; };
+ 50245A582A80431C0034792B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 50245A592A80431C0034792B /* NetbirdNetworkExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NetbirdNetworkExtension.entitlements; sourceTree = ""; };
+ 505118C82AD96ECA003027D3 /* WireGuardKitC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WireGuardKitC.h; sourceTree = ""; };
+ 505118C92AD96ECA003027D3 /* key.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = key.h; sourceTree = ""; };
+ 505118CA2AD96ECA003027D3 /* x25519.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x25519.c; sourceTree = ""; };
+ 505118CB2AD96ECA003027D3 /* key.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = key.c; sourceTree = ""; };
+ 505118CC2AD96ECA003027D3 /* module.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; };
+ 505118CD2AD96ECA003027D3 /* x25519.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x25519.h; sourceTree = ""; };
+ 506331F72AF1676B00BC8F0E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; };
+ 506331FA2AF52AB900BC8F0E /* CustomLottieView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomLottieView.swift; sourceTree = ""; };
+ 506331FF2AF9197700BC8F0E /* button-full2-dark.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-full2-dark.json"; sourceTree = ""; };
+ 506332012AF9415500BC8F0E /* CustomTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTextField.swift; sourceTree = ""; };
+ 508BD8442AF04A990055E415 /* SafariView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariView.swift; sourceTree = ""; };
+ 50A891172A792A15007C48FC /* NetBird.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetBird.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 50A8911A2A792A15007C48FC /* NetBirdApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetBirdApp.swift; sourceTree = ""; };
+ 50A8911C2A792A15007C48FC /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; };
+ 50A8911E2A792A16007C48FC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 50C727EB2A824812006E898D /* NetBirdAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetBirdAdapter.swift; sourceTree = ""; };
+ 50CD814E2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelProviderSettingsManager.swift; sourceTree = ""; };
+ 50CD81612AD0595E00CF830B /* DNSManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DNSManager.swift; sourceTree = ""; };
+ 50CD81A62AD5504B00CF830B /* StatusDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusDetails.swift; sourceTree = ""; };
+ 50CD81AF2AD5B94D00CF830B /* PeerCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerCard.swift; sourceTree = ""; };
+ 50CD84352AD82F9400CF830B /* ServerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerView.swift; sourceTree = ""; };
+ 50E608022A7950CB00BAF09B /* Device.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Device.swift; sourceTree = ""; };
+ 50E608122A7958B100BAF09B /* MainViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewModel.swift; sourceTree = ""; };
+ 50E6081F2A7979D600BAF09B /* SideDrawer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideDrawer.swift; sourceTree = ""; };
+ 50E608232A79966600BAF09B /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; };
+ 50E608252A79968500BAF09B /* AdvancedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedView.swift; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 50245A4F2A80431B0034792B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 508BD8492AF140D50055E415 /* FirebaseAnalyticsSwift in Frameworks */,
+ 50245A542A80431B0034792B /* NetworkExtension.framework in Frameworks */,
+ 50003BBE2AFBCA7900E5EB6B /* FirebasePerformance in Frameworks */,
+ 508BD84B2AF140D50055E415 /* FirebaseCrashlytics in Frameworks */,
+ 50C78AFA2A82D036006E898D /* libresolv.tbd in Frameworks */,
+ 508BD8472AF140D50055E415 /* FirebaseAnalytics in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 50A891142A792A15007C48FC /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 505119112AE03F68003027D3 /* FirebaseAnalyticsSwift in Frameworks */,
+ 506331FE2AF53CFF00BC8F0E /* Lottie in Frameworks */,
+ 50245A1A2A7BCE890034792B /* libresolv.tbd in Frameworks */,
+ 505119132AE03F68003027D3 /* FirebaseAppCheck in Frameworks */,
+ 50051DE02AE69A8100AFBDC4 /* FirebaseCrashlytics in Frameworks */,
+ 501B0E012AE27ABA004BE7A7 /* NetBirdSDK.xcframework in Frameworks */,
+ 50003BBC2AFBCA6B00E5EB6B /* FirebasePerformance in Frameworks */,
+ 5051190F2AE03F68003027D3 /* FirebaseAnalytics in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 501B0DC42AE04DDE004BE7A7 /* animations */ = {
+ isa = PBXGroup;
+ children = (
+ 501B0DC52AE04DDE004BE7A7 /* button-disconnecting.json */,
+ 501B0DC62AE04DDE004BE7A7 /* button-connecting-loop.json */,
+ 501B0DC72AE04DDE004BE7A7 /* logo_NetBird.json */,
+ 501B0DC82AE04DDE004BE7A7 /* loading.json */,
+ 501B0DC92AE04DDE004BE7A7 /* button-start-connecting.json */,
+ 501B0DCA2AE04DDE004BE7A7 /* button-full2.json */,
+ 501B0DCB2AE04DDE004BE7A7 /* button-full.json */,
+ 506331FF2AF9197700BC8F0E /* button-full2-dark.json */,
+ 501B0DCC2AE04DDE004BE7A7 /* button-connected.json */,
+ );
+ path = animations;
+ sourceTree = "";
+ };
+ 50245A182A7BCE830034792B /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 50245A192A7BCE830034792B /* libresolv.tbd */,
+ 50245A532A80431B0034792B /* NetworkExtension.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 50245A552A80431C0034792B /* NetbirdNetworkExtension */ = {
+ isa = PBXGroup;
+ children = (
+ 50C727EB2A824812006E898D /* NetBirdAdapter.swift */,
+ 50245A562A80431C0034792B /* PacketTunnelProvider.swift */,
+ 50245A582A80431C0034792B /* Info.plist */,
+ 50245A592A80431C0034792B /* NetbirdNetworkExtension.entitlements */,
+ 50CD814E2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift */,
+ );
+ path = NetbirdNetworkExtension;
+ sourceTree = "";
+ };
+ 505118C72AD96ECA003027D3 /* WireGuardKitC */ = {
+ isa = PBXGroup;
+ children = (
+ 505118C82AD96ECA003027D3 /* WireGuardKitC.h */,
+ 505118C92AD96ECA003027D3 /* key.h */,
+ 505118CA2AD96ECA003027D3 /* x25519.c */,
+ 505118CB2AD96ECA003027D3 /* key.c */,
+ 505118CC2AD96ECA003027D3 /* module.modulemap */,
+ 505118CD2AD96ECA003027D3 /* x25519.h */,
+ );
+ path = WireGuardKitC;
+ sourceTree = "";
+ };
+ 50A8910E2A792A15007C48FC = {
+ isa = PBXGroup;
+ children = (
+ 506331F72AF1676B00BC8F0E /* GoogleService-Info.plist */,
+ 501B0E002AE27ABA004BE7A7 /* NetBirdSDK.xcframework */,
+ 50245A0A2A7AA9390034792B /* NetBird-Bridging-Header.h */,
+ 50A891192A792A15007C48FC /* NetBird */,
+ 50C727EA2A82479B006E898D /* NetbirdKit */,
+ 50245A552A80431C0034792B /* NetbirdNetworkExtension */,
+ 505118C72AD96ECA003027D3 /* WireGuardKitC */,
+ 50A891182A792A15007C48FC /* Products */,
+ 50245A182A7BCE830034792B /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 50A891182A792A15007C48FC /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 50A891172A792A15007C48FC /* NetBird.app */,
+ 50245A522A80431B0034792B /* NetbirdNetworkExtension.appex */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 50A891192A792A15007C48FC /* NetBird */ = {
+ isa = PBXGroup;
+ children = (
+ 50245A3B2A7FD1CD0034792B /* Info.plist */,
+ 50245A1B2A7BCF120034792B /* NetBird.entitlements */,
+ 50E608082A79542D00BAF09B /* Source */,
+ 50A8911E2A792A16007C48FC /* Assets.xcassets */,
+ );
+ path = NetBird;
+ sourceTree = "";
+ };
+ 50C727EA2A82479B006E898D /* NetbirdKit */ = {
+ isa = PBXGroup;
+ children = (
+ 50245A292A7BDB590034792B /* Preferences.swift */,
+ 50245A2D2A7BDC470034792B /* NetworkChangeListener.swift */,
+ 50CD81612AD0595E00CF830B /* DNSManager.swift */,
+ 50E608022A7950CB00BAF09B /* Device.swift */,
+ 50216D922ACB2488009574C9 /* NetworkExtensionAdapter.swift */,
+ 50CD81A62AD5504B00CF830B /* StatusDetails.swift */,
+ 50003BC82AFD2F0C00E5EB6B /* ConnectionListener.swift */,
+ 50003BCB2AFD3B0C00E5EB6B /* ClientState.swift */,
+ );
+ path = NetbirdKit;
+ sourceTree = "";
+ };
+ 50E607FF2A794F8200BAF09B /* Views */ = {
+ isa = PBXGroup;
+ children = (
+ 50E608092A79557A00BAF09B /* Components */,
+ 50A8911C2A792A15007C48FC /* MainView.swift */,
+ 50E608232A79966600BAF09B /* AboutView.swift */,
+ 50E608252A79968500BAF09B /* AdvancedView.swift */,
+ 50CD84352AD82F9400CF830B /* ServerView.swift */,
+ );
+ path = Views;
+ sourceTree = "";
+ };
+ 50E608012A7950C000BAF09B /* ViewModels */ = {
+ isa = PBXGroup;
+ children = (
+ 50E608122A7958B100BAF09B /* MainViewModel.swift */,
+ );
+ path = ViewModels;
+ sourceTree = "";
+ };
+ 50E608082A79542D00BAF09B /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ 501B0DC42AE04DDE004BE7A7 /* animations */,
+ 50E6080A2A79568800BAF09B /* App */,
+ );
+ path = Source;
+ sourceTree = "";
+ };
+ 50E608092A79557A00BAF09B /* Components */ = {
+ isa = PBXGroup;
+ children = (
+ 50E6081F2A7979D600BAF09B /* SideDrawer.swift */,
+ 502455BC2A79B0480034792B /* CustomBackButton.swift */,
+ 502455BE2A79B4500034792B /* SolidButton.swift */,
+ 50CD81AF2AD5B94D00CF830B /* PeerCard.swift */,
+ 508BD8442AF04A990055E415 /* SafariView.swift */,
+ 506331FA2AF52AB900BC8F0E /* CustomLottieView.swift */,
+ 506332012AF9415500BC8F0E /* CustomTextField.swift */,
+ );
+ path = Components;
+ sourceTree = "";
+ };
+ 50E6080A2A79568800BAF09B /* App */ = {
+ isa = PBXGroup;
+ children = (
+ 50A8911A2A792A15007C48FC /* NetBirdApp.swift */,
+ 50E607FF2A794F8200BAF09B /* Views */,
+ 50E608012A7950C000BAF09B /* ViewModels */,
+ );
+ path = App;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 50245A512A80431B0034792B /* NetbirdNetworkExtension */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 50245A5D2A80431C0034792B /* Build configuration list for PBXNativeTarget "NetbirdNetworkExtension" */;
+ buildPhases = (
+ 50245A4E2A80431B0034792B /* Sources */,
+ 50245A4F2A80431B0034792B /* Frameworks */,
+ 50245A502A80431B0034792B /* Resources */,
+ 508BD8522AF158F80055E415 /* ShellScript */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = NetbirdNetworkExtension;
+ packageProductDependencies = (
+ 508BD8462AF140D50055E415 /* FirebaseAnalytics */,
+ 508BD8482AF140D50055E415 /* FirebaseAnalyticsSwift */,
+ 508BD84A2AF140D50055E415 /* FirebaseCrashlytics */,
+ 50003BBD2AFBCA7900E5EB6B /* FirebasePerformance */,
+ );
+ productName = NetbirdNetworkExtension;
+ productReference = 50245A522A80431B0034792B /* NetbirdNetworkExtension.appex */;
+ productType = "com.apple.product-type.app-extension";
+ };
+ 50A891162A792A15007C48FC /* NetBird */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 50A891252A792A16007C48FC /* Build configuration list for PBXNativeTarget "NetBird" */;
+ buildPhases = (
+ 50A891132A792A15007C48FC /* Sources */,
+ 50A891142A792A15007C48FC /* Frameworks */,
+ 50A891152A792A15007C48FC /* Resources */,
+ 50245A602A80431C0034792B /* Embed Foundation Extensions */,
+ 508BD8502AF153350055E415 /* ShellScript */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 50245A5B2A80431C0034792B /* PBXTargetDependency */,
+ );
+ name = NetBird;
+ packageProductDependencies = (
+ 5051190E2AE03F68003027D3 /* FirebaseAnalytics */,
+ 505119102AE03F68003027D3 /* FirebaseAnalyticsSwift */,
+ 505119122AE03F68003027D3 /* FirebaseAppCheck */,
+ 50051DDF2AE69A8100AFBDC4 /* FirebaseCrashlytics */,
+ 506331FD2AF53CFF00BC8F0E /* Lottie */,
+ 50003BBB2AFBCA6B00E5EB6B /* FirebasePerformance */,
+ );
+ productName = NetBirdiOS;
+ productReference = 50A891172A792A15007C48FC /* NetBird.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 50A8910F2A792A15007C48FC /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1430;
+ LastUpgradeCheck = 1430;
+ TargetAttributes = {
+ 50245A512A80431B0034792B = {
+ CreatedOnToolsVersion = 14.3.1;
+ LastSwiftMigration = 1430;
+ };
+ 50A891162A792A15007C48FC = {
+ CreatedOnToolsVersion = 14.3.1;
+ LastSwiftMigration = 1430;
+ };
+ };
+ };
+ buildConfigurationList = 50A891122A792A15007C48FC /* Build configuration list for PBXProject "NetBird" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 50A8910E2A792A15007C48FC;
+ packageReferences = (
+ 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
+ 506331FC2AF52B8100BC8F0E /* XCRemoteSwiftPackageReference "lottie-ios" */,
+ );
+ productRefGroup = 50A891182A792A15007C48FC /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 50A891162A792A15007C48FC /* NetBird */,
+ 50245A512A80431B0034792B /* NetbirdNetworkExtension */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 50245A502A80431B0034792B /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 501B0DCE2AE04DDE004BE7A7 /* button-disconnecting.json in Resources */,
+ 501B0DD22AE04DDE004BE7A7 /* logo_NetBird.json in Resources */,
+ 501B0DDC2AE04DDE004BE7A7 /* button-connected.json in Resources */,
+ 501B0DD62AE04DDE004BE7A7 /* button-start-connecting.json in Resources */,
+ 501B0DDA2AE04DDE004BE7A7 /* button-full.json in Resources */,
+ 501B0DD02AE04DDE004BE7A7 /* button-connecting-loop.json in Resources */,
+ 506331F92AF1676B00BC8F0E /* GoogleService-Info.plist in Resources */,
+ 501B0DD82AE04DDE004BE7A7 /* button-full2.json in Resources */,
+ 501B0DD42AE04DDE004BE7A7 /* loading.json in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 50A891152A792A15007C48FC /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 506332002AF9197700BC8F0E /* button-full2-dark.json in Resources */,
+ 501B0DD52AE04DDE004BE7A7 /* button-start-connecting.json in Resources */,
+ 50A8911F2A792A16007C48FC /* Assets.xcassets in Resources */,
+ 501B0DD32AE04DDE004BE7A7 /* loading.json in Resources */,
+ 501B0DD92AE04DDE004BE7A7 /* button-full.json in Resources */,
+ 501B0DCD2AE04DDE004BE7A7 /* button-disconnecting.json in Resources */,
+ 501B0DD12AE04DDE004BE7A7 /* logo_NetBird.json in Resources */,
+ 501B0DDB2AE04DDE004BE7A7 /* button-connected.json in Resources */,
+ 506331F82AF1676B00BC8F0E /* GoogleService-Info.plist in Resources */,
+ 501B0DCF2AE04DDE004BE7A7 /* button-connecting-loop.json in Resources */,
+ 501B0DD72AE04DDE004BE7A7 /* button-full2.json in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 508BD8502AF153350055E415 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}",
+ "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}",
+ "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist",
+ "$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist",
+ "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)",
+ );
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n\"${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\n";
+ };
+ 508BD8522AF158F80055E415 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}",
+ "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}",
+ "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist",
+ "$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist",
+ "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)",
+ );
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n\"${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\n";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 50245A4E2A80431B0034792B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 50CD81632AD0595E00CF830B /* DNSManager.swift in Sources */,
+ 50C727ED2A824C10006E898D /* NetBirdAdapter.swift in Sources */,
+ 50245A572A80431C0034792B /* PacketTunnelProvider.swift in Sources */,
+ 505118D12AD96ECA003027D3 /* key.c in Sources */,
+ 50213A2D2A8D0AA30031D993 /* Preferences.swift in Sources */,
+ 50CD81A82AD5504B00CF830B /* StatusDetails.swift in Sources */,
+ 50003BCA2AFD2F5E00E5EB6B /* ConnectionListener.swift in Sources */,
+ 50213A262A8D0A870031D993 /* NetworkChangeListener.swift in Sources */,
+ 50CD81502AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift in Sources */,
+ 50003BCD2AFD3B2B00E5EB6B /* ClientState.swift in Sources */,
+ 50CD81B12AD5B94D00CF830B /* PeerCard.swift in Sources */,
+ 50C78AD12A82BBFD006E898D /* Device.swift in Sources */,
+ 505118CF2AD96ECA003027D3 /* x25519.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 50A891132A792A15007C48FC /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 50CD84362AD82F9400CF830B /* ServerView.swift in Sources */,
+ 50A8911D2A792A15007C48FC /* MainView.swift in Sources */,
+ 50CD814F2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift in Sources */,
+ 50C78AEA2A82C858006E898D /* Device.swift in Sources */,
+ 50A8911B2A792A15007C48FC /* NetBirdApp.swift in Sources */,
+ 502455BF2A79B4500034792B /* SolidButton.swift in Sources */,
+ 50E608202A7979D600BAF09B /* SideDrawer.swift in Sources */,
+ 50216D932ACB2488009574C9 /* NetworkExtensionAdapter.swift in Sources */,
+ 506331FB2AF52AB900BC8F0E /* CustomLottieView.swift in Sources */,
+ 50003BCC2AFD3B0C00E5EB6B /* ClientState.swift in Sources */,
+ 506332022AF9415500BC8F0E /* CustomTextField.swift in Sources */,
+ 50003BC42AFBD7D500E5EB6B /* PacketTunnelProvider.swift in Sources */,
+ 50216D8E2ACB1905009574C9 /* NetworkChangeListener.swift in Sources */,
+ 50CD81A72AD5504B00CF830B /* StatusDetails.swift in Sources */,
+ 505118CE2AD96ECA003027D3 /* x25519.c in Sources */,
+ 508BD8452AF04A990055E415 /* SafariView.swift in Sources */,
+ 505118D02AD96ECA003027D3 /* key.c in Sources */,
+ 50E608262A79968500BAF09B /* AdvancedView.swift in Sources */,
+ 50E608242A79966600BAF09B /* AboutView.swift in Sources */,
+ 50CD81622AD0595E00CF830B /* DNSManager.swift in Sources */,
+ 502455BD2A79B0480034792B /* CustomBackButton.swift in Sources */,
+ 50216D892ACB18EE009574C9 /* Preferences.swift in Sources */,
+ 50CD81B02AD5B94D00CF830B /* PeerCard.swift in Sources */,
+ 50003BCE2AFD405600E5EB6B /* ConnectionListener.swift in Sources */,
+ 50003BC72AFBD7F200E5EB6B /* NetBirdAdapter.swift in Sources */,
+ 50E608132A7958B100BAF09B /* MainViewModel.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 50245A5B2A80431C0034792B /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 50245A512A80431B0034792B /* NetbirdNetworkExtension */;
+ targetProxy = 50245A5A2A80431C0034792B /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 50245A5E2A80431C0034792B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = NetbirdNetworkExtension/NetbirdNetworkExtension.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = TA739QLA7A;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = NetbirdNetworkExtension/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = NetbirdNetworkExtension;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = io.netbird.app.NetbirdNetworkExtension;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_OBJC_BRIDGING_HEADER = "NetBird-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 50245A5F2A80431C0034792B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = NetbirdNetworkExtension/NetbirdNetworkExtension.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = TA739QLA7A;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = NetbirdNetworkExtension/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = NetbirdNetworkExtension;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@executable_path/../../Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = io.netbird.app.NetbirdNetworkExtension;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SKIP_INSTALL = YES;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_OBJC_BRIDGING_HEADER = "NetBird-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 50A891232A792A16007C48FC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_PRECOMPILE_BRIDGING_HEADER = NO;
+ };
+ name = Debug;
+ };
+ 50A891242A792A16007C48FC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ SWIFT_PRECOMPILE_BRIDGING_HEADER = NO;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 50A891262A792A16007C48FC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = NetBird/NetBird.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 3;
+ DEVELOPMENT_ASSET_PATHS = "";
+ DEVELOPMENT_TEAM = TA739QLA7A;
+ ENABLE_PREVIEWS = YES;
+ FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/**";
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = NetBird/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = NetBird;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
+ INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchScreen_Generation = YES;
+ INFOPLIST_KEY_UIRequiresFullScreen = YES;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/WireGuardKitGo/out",
+ "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/cmd/objdump/testdata",
+ "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/go/internal/gcimporter/testdata/versions",
+ "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/go/internal/gccgoimporter/testdata",
+ "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge",
+ );
+ MARKETING_VERSION = 0.0.2;
+ PRODUCT_BUNDLE_IDENTIFIER = io.netbird.app;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_OBJC_BRIDGING_HEADER = "NetBird-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 50A891272A792A16007C48FC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = NetBird/NetBird.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 3;
+ DEVELOPMENT_ASSET_PATHS = "";
+ DEVELOPMENT_TEAM = TA739QLA7A;
+ ENABLE_PREVIEWS = YES;
+ FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/**";
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = NetBird/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = NetBird;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
+ INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchScreen_Generation = YES;
+ INFOPLIST_KEY_UIRequiresFullScreen = YES;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(PROJECT_DIR)/WireGuardKitGo/out",
+ "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/cmd/objdump/testdata",
+ "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/go/internal/gcimporter/testdata/versions",
+ "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/go/internal/gccgoimporter/testdata",
+ "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge",
+ );
+ MARKETING_VERSION = 0.0.2;
+ PRODUCT_BUNDLE_IDENTIFIER = io.netbird.app;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_OBJC_BRIDGING_HEADER = "NetBird-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 50245A5D2A80431C0034792B /* Build configuration list for PBXNativeTarget "NetbirdNetworkExtension" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 50245A5E2A80431C0034792B /* Debug */,
+ 50245A5F2A80431C0034792B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 50A891122A792A15007C48FC /* Build configuration list for PBXProject "NetBird" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 50A891232A792A16007C48FC /* Debug */,
+ 50A891242A792A16007C48FC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 50A891252A792A16007C48FC /* Build configuration list for PBXNativeTarget "NetBird" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 50A891262A792A16007C48FC /* Debug */,
+ 50A891272A792A16007C48FC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCRemoteSwiftPackageReference section */
+ 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/firebase/firebase-ios-sdk";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 10.16.0;
+ };
+ };
+ 506331FC2AF52B8100BC8F0E /* XCRemoteSwiftPackageReference "lottie-ios" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/airbnb/lottie-ios";
+ requirement = {
+ kind = upToNextMajorVersion;
+ minimumVersion = 4.3.3;
+ };
+ };
+/* End XCRemoteSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ 50003BBB2AFBCA6B00E5EB6B /* FirebasePerformance */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebasePerformance;
+ };
+ 50003BBD2AFBCA7900E5EB6B /* FirebasePerformance */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebasePerformance;
+ };
+ 50051DDF2AE69A8100AFBDC4 /* FirebaseCrashlytics */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseCrashlytics;
+ };
+ 5051190E2AE03F68003027D3 /* FirebaseAnalytics */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseAnalytics;
+ };
+ 505119102AE03F68003027D3 /* FirebaseAnalyticsSwift */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseAnalyticsSwift;
+ };
+ 505119122AE03F68003027D3 /* FirebaseAppCheck */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseAppCheck;
+ };
+ 506331FD2AF53CFF00BC8F0E /* Lottie */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 506331FC2AF52B8100BC8F0E /* XCRemoteSwiftPackageReference "lottie-ios" */;
+ productName = Lottie;
+ };
+ 508BD8462AF140D50055E415 /* FirebaseAnalytics */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseAnalytics;
+ };
+ 508BD8482AF140D50055E415 /* FirebaseAnalyticsSwift */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseAnalyticsSwift;
+ };
+ 508BD84A2AF140D50055E415 /* FirebaseCrashlytics */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
+ productName = FirebaseCrashlytics;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = 50A8910F2A792A15007C48FC /* Project object */;
+}
diff --git a/NetBird.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/NetBird.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/NetBird.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/NetBird.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/NetBird.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..0c67376
--- /dev/null
+++ b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/NetBird.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
new file mode 100644
index 0000000..1eaa9ab
--- /dev/null
+++ b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -0,0 +1,122 @@
+{
+ "pins" : [
+ {
+ "identity" : "abseil-cpp-binary",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/abseil-cpp-binary.git",
+ "state" : {
+ "revision" : "bfc0b6f81adc06ce5121eb23f628473638d67c5c",
+ "version" : "1.2022062300.0"
+ }
+ },
+ {
+ "identity" : "firebase-ios-sdk",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/firebase-ios-sdk",
+ "state" : {
+ "revision" : "837d4af6ead57cec1fc38007892500d3139c7556",
+ "version" : "10.16.0"
+ }
+ },
+ {
+ "identity" : "googleappmeasurement",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleAppMeasurement.git",
+ "state" : {
+ "revision" : "56f681586ff006a7982b53dc94082eea31971acf",
+ "version" : "10.16.0"
+ }
+ },
+ {
+ "identity" : "googledatatransport",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleDataTransport.git",
+ "state" : {
+ "revision" : "aae45a320fd0d11811820335b1eabc8753902a40",
+ "version" : "9.2.5"
+ }
+ },
+ {
+ "identity" : "googleutilities",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/GoogleUtilities.git",
+ "state" : {
+ "revision" : "c38ce365d77b04a9a300c31061c5227589e5597b",
+ "version" : "7.11.5"
+ }
+ },
+ {
+ "identity" : "grpc-binary",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/grpc-binary.git",
+ "state" : {
+ "revision" : "a673bc2937fbe886dd1f99c401b01b6d977a9c98",
+ "version" : "1.49.1"
+ }
+ },
+ {
+ "identity" : "gtm-session-fetcher",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/gtm-session-fetcher.git",
+ "state" : {
+ "revision" : "d415594121c9e8a4f9d79cecee0965cf35e74dbd",
+ "version" : "3.1.1"
+ }
+ },
+ {
+ "identity" : "interop-ios-for-google-sdks",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/interop-ios-for-google-sdks.git",
+ "state" : {
+ "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648",
+ "version" : "100.0.0"
+ }
+ },
+ {
+ "identity" : "leveldb",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/leveldb.git",
+ "state" : {
+ "revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b",
+ "version" : "1.22.2"
+ }
+ },
+ {
+ "identity" : "lottie-ios",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/airbnb/lottie-ios",
+ "state" : {
+ "revision" : "45517c3cfec9469bbdd4f86e32393c28ae9df0bc",
+ "version" : "4.3.3"
+ }
+ },
+ {
+ "identity" : "nanopb",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/firebase/nanopb.git",
+ "state" : {
+ "revision" : "819d0a2173aff699fb8c364b6fb906f7cdb1a692",
+ "version" : "2.30909.0"
+ }
+ },
+ {
+ "identity" : "promises",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/google/promises.git",
+ "state" : {
+ "revision" : "e70e889c0196c76d22759eb50d6a0270ca9f1d9e",
+ "version" : "2.3.1"
+ }
+ },
+ {
+ "identity" : "swift-protobuf",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/apple/swift-protobuf.git",
+ "state" : {
+ "revision" : "3c54ab05249f59f2c6641dd2920b8358ea9ed127",
+ "version" : "1.24.0"
+ }
+ }
+ ],
+ "version" : 2
+}
diff --git a/NetBird.xcodeproj/xcshareddata/xcschemes/NetBird.xcscheme b/NetBird.xcodeproj/xcshareddata/xcschemes/NetBird.xcscheme
new file mode 100644
index 0000000..54896d3
--- /dev/null
+++ b/NetBird.xcodeproj/xcshareddata/xcschemes/NetBird.xcscheme
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/NetBird.xcodeproj/xcshareddata/xcschemes/NetbirdNetworkExtension.xcscheme b/NetBird.xcodeproj/xcshareddata/xcschemes/NetbirdNetworkExtension.xcscheme
new file mode 100644
index 0000000..50f3e46
--- /dev/null
+++ b/NetBird.xcodeproj/xcshareddata/xcschemes/NetbirdNetworkExtension.xcscheme
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/NetBird/Assets.xcassets/AccentColor.colorset/Contents.json b/NetBird/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..5135698
--- /dev/null
+++ b/NetBird/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x30",
+ "green" : "0x83",
+ "red" : "0xF6"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/AppIcon.appiconset/Contents.json b/NetBird/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..629c6d8
--- /dev/null
+++ b/NetBird/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,14 @@
+{
+ "images" : [
+ {
+ "filename" : "appstore-white.png",
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/AppIcon.appiconset/appstore-white.png b/NetBird/Assets.xcassets/AppIcon.appiconset/appstore-white.png
new file mode 100644
index 0000000..a84e083
Binary files /dev/null and b/NetBird/Assets.xcassets/AppIcon.appiconset/appstore-white.png differ
diff --git a/NetBird/Assets.xcassets/Colors/BgMenu.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgMenu.colorset/Contents.json
new file mode 100644
index 0000000..e901db6
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/BgMenu.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xEB",
+ "green" : "0xEB",
+ "red" : "0xEB"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x1F",
+ "green" : "0x1C",
+ "red" : "0x1A"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/BgNavigationBar.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgNavigationBar.colorset/Contents.json
new file mode 100644
index 0000000..9ea17fd
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/BgNavigationBar.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xFF",
+ "green" : "0xFF",
+ "red" : "0xFE"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x21",
+ "green" : "0x1E",
+ "red" : "0x1C"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/BgPage.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgPage.colorset/Contents.json
new file mode 100644
index 0000000..8d8394f
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/BgPage.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "0.140",
+ "blue" : "0x00",
+ "green" : "0x00",
+ "red" : "0x00"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x1D",
+ "green" : "0x1A",
+ "red" : "0x18"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/BgPrimary.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgPrimary.colorset/Contents.json
new file mode 100644
index 0000000..2e2d0b9
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/BgPrimary.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "0.050",
+ "blue" : "0x00",
+ "green" : "0x00",
+ "red" : "0x00"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x1D",
+ "green" : "0x1A",
+ "red" : "0x18"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/BgSecondary.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgSecondary.colorset/Contents.json
new file mode 100644
index 0000000..c0fe7dc
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/BgSecondary.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "0.140",
+ "blue" : "0x00",
+ "green" : "0x00",
+ "red" : "0x00"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x21",
+ "green" : "0x1E",
+ "red" : "0x1C"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/BgSideDrawer.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgSideDrawer.colorset/Contents.json
new file mode 100644
index 0000000..0b43a67
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/BgSideDrawer.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xFF",
+ "green" : "0xFF",
+ "red" : "0xFE"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x1F",
+ "green" : "0x1C",
+ "red" : "0x1A"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/Contents.json b/NetBird/Assets.xcassets/Colors/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/HandleBar.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/HandleBar.colorset/Contents.json
new file mode 100644
index 0000000..a1dfc75
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/HandleBar.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "0.080",
+ "blue" : "0x00",
+ "green" : "0x00",
+ "red" : "0x00"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "0.250",
+ "blue" : "0x00",
+ "green" : "0x00",
+ "red" : "0x00"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/PeerCard/BgPeerCard.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/PeerCard/BgPeerCard.colorset/Contents.json
new file mode 100644
index 0000000..a71bccd
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/PeerCard/BgPeerCard.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xE0",
+ "green" : "0xE0",
+ "red" : "0xE0"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x1D",
+ "green" : "0x1A",
+ "red" : "0x18"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/PeerCard/Contents.json b/NetBird/Assets.xcassets/Colors/PeerCard/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/PeerCard/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/PeerCard/TextPeerCard.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/PeerCard/TextPeerCard.colorset/Contents.json
new file mode 100644
index 0000000..e7016ef
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/PeerCard/TextPeerCard.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x4D",
+ "green" : "0x4D",
+ "red" : "0x4D"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x8F",
+ "green" : "0x85",
+ "red" : "0x7E"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/TextAlert.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/TextAlert.colorset/Contents.json
new file mode 100644
index 0000000..3fe9b59
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/TextAlert.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x00",
+ "green" : "0x00",
+ "red" : "0x00"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xFF",
+ "green" : "0xFF",
+ "red" : "0xFE"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/TextField/BgTextField.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/TextField/BgTextField.colorset/Contents.json
new file mode 100644
index 0000000..158931e
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/TextField/BgTextField.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xFF",
+ "green" : "0xFF",
+ "red" : "0xFE"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x3D",
+ "green" : "0x36",
+ "red" : "0x32"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/TextField/BorderTextField.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/TextField/BorderTextField.colorset/Contents.json
new file mode 100644
index 0000000..9a2cc8c
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/TextField/BorderTextField.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xFF",
+ "green" : "0xFF",
+ "red" : "0xFE"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x61",
+ "green" : "0x59",
+ "red" : "0x54"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/TextField/Contents.json b/NetBird/Assets.xcassets/Colors/TextField/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/TextField/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/TextPrimary.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/TextPrimary.colorset/Contents.json
new file mode 100644
index 0000000..048410b
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/TextPrimary.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x4D",
+ "green" : "0x4D",
+ "red" : "0x4D"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xFF",
+ "green" : "0xFF",
+ "red" : "0xFE"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Colors/TextSecondary.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/TextSecondary.colorset/Contents.json
new file mode 100644
index 0000000..eeceb68
--- /dev/null
+++ b/NetBird/Assets.xcassets/Colors/TextSecondary.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x86",
+ "green" : "0x86",
+ "red" : "0x86"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x8F",
+ "green" : "0x85",
+ "red" : "0x7E"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/Contents.json b/NetBird/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/NetBird/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/backgroundIntersection.imageset/Contents.json b/NetBird/Assets.xcassets/backgroundIntersection.imageset/Contents.json
new file mode 100644
index 0000000..e3a73ac
--- /dev/null
+++ b/NetBird/Assets.xcassets/backgroundIntersection.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "backgroundIntersection.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/backgroundIntersection.imageset/backgroundIntersection.png b/NetBird/Assets.xcassets/backgroundIntersection.imageset/backgroundIntersection.png
new file mode 100644
index 0000000..64c98a7
Binary files /dev/null and b/NetBird/Assets.xcassets/backgroundIntersection.imageset/backgroundIntersection.png differ
diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/Contents.json b/NetBird/Assets.xcassets/bg-bottom.imageset/Contents.json
new file mode 100644
index 0000000..ead3d7f
--- /dev/null
+++ b/NetBird/Assets.xcassets/bg-bottom.imageset/Contents.json
@@ -0,0 +1,56 @@
+{
+ "images" : [
+ {
+ "filename" : "bg-bottom 1.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "bg-bottom.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "bg-bottom@2x 1.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "bg-bottom@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "bg-bottom@3x 1.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "bg-bottom@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom 1.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom 1.png
new file mode 100644
index 0000000..d65a7fd
Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom 1.png differ
diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom.png
new file mode 100644
index 0000000..feae444
Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom.png differ
diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x 1.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x 1.png
new file mode 100644
index 0000000..552cf7c
Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x 1.png differ
diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x.png
new file mode 100644
index 0000000..84e36a1
Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x.png differ
diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x 1.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x 1.png
new file mode 100644
index 0000000..c3cd6b5
Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x 1.png differ
diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x.png
new file mode 100644
index 0000000..c5a3024
Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x.png differ
diff --git a/NetBird/Assets.xcassets/bg-bottom@4x.imageset/Contents.json b/NetBird/Assets.xcassets/bg-bottom@4x.imageset/Contents.json
new file mode 100644
index 0000000..2fb9167
--- /dev/null
+++ b/NetBird/Assets.xcassets/bg-bottom@4x.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "bg-bottom@4x.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/bg-bottom@4x.imageset/bg-bottom@4x.png b/NetBird/Assets.xcassets/bg-bottom@4x.imageset/bg-bottom@4x.png
new file mode 100644
index 0000000..2c8710c
Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom@4x.imageset/bg-bottom@4x.png differ
diff --git a/NetBird/Assets.xcassets/check-circle.imageset/Contents.json b/NetBird/Assets.xcassets/check-circle.imageset/Contents.json
new file mode 100644
index 0000000..7fc2f37
--- /dev/null
+++ b/NetBird/Assets.xcassets/check-circle.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "check-circle.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "check-circle@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "check-circle@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/check-circle.imageset/check-circle.png b/NetBird/Assets.xcassets/check-circle.imageset/check-circle.png
new file mode 100644
index 0000000..8726230
Binary files /dev/null and b/NetBird/Assets.xcassets/check-circle.imageset/check-circle.png differ
diff --git a/NetBird/Assets.xcassets/check-circle.imageset/check-circle@2x.png b/NetBird/Assets.xcassets/check-circle.imageset/check-circle@2x.png
new file mode 100644
index 0000000..d938c46
Binary files /dev/null and b/NetBird/Assets.xcassets/check-circle.imageset/check-circle@2x.png differ
diff --git a/NetBird/Assets.xcassets/check-circle.imageset/check-circle@3x.png b/NetBird/Assets.xcassets/check-circle.imageset/check-circle@3x.png
new file mode 100644
index 0000000..e2356b8
Binary files /dev/null and b/NetBird/Assets.xcassets/check-circle.imageset/check-circle@3x.png differ
diff --git a/NetBird/Assets.xcassets/chevron.left.imageset/Contents.json b/NetBird/Assets.xcassets/chevron.left.imageset/Contents.json
new file mode 100644
index 0000000..567a1f7
--- /dev/null
+++ b/NetBird/Assets.xcassets/chevron.left.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "chevron.left.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "chevron.left@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "chevron.left@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left.png b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left.png
new file mode 100644
index 0000000..551fc15
Binary files /dev/null and b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left.png differ
diff --git a/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@2x.png b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@2x.png
new file mode 100644
index 0000000..feeef95
Binary files /dev/null and b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@2x.png differ
diff --git a/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@3x.png b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@3x.png
new file mode 100644
index 0000000..6fe9d06
Binary files /dev/null and b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@3x.png differ
diff --git a/NetBird/Assets.xcassets/chevron.left@4x.imageset/Contents.json b/NetBird/Assets.xcassets/chevron.left@4x.imageset/Contents.json
new file mode 100644
index 0000000..1058f45
--- /dev/null
+++ b/NetBird/Assets.xcassets/chevron.left@4x.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "chevron.left@4x.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/chevron.left@4x.imageset/chevron.left@4x.png b/NetBird/Assets.xcassets/chevron.left@4x.imageset/chevron.left@4x.png
new file mode 100644
index 0000000..cf2940e
Binary files /dev/null and b/NetBird/Assets.xcassets/chevron.left@4x.imageset/chevron.left@4x.png differ
diff --git a/NetBird/Assets.xcassets/close-slider-4x.imageset/Contents.json b/NetBird/Assets.xcassets/close-slider-4x.imageset/Contents.json
new file mode 100644
index 0000000..2d21ab4
--- /dev/null
+++ b/NetBird/Assets.xcassets/close-slider-4x.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "close-slider-4x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/close-slider-4x.imageset/close-slider-4x.png b/NetBird/Assets.xcassets/close-slider-4x.imageset/close-slider-4x.png
new file mode 100644
index 0000000..0da363d
Binary files /dev/null and b/NetBird/Assets.xcassets/close-slider-4x.imageset/close-slider-4x.png differ
diff --git a/NetBird/Assets.xcassets/close-slider.imageset/Contents.json b/NetBird/Assets.xcassets/close-slider.imageset/Contents.json
new file mode 100644
index 0000000..a056e9f
--- /dev/null
+++ b/NetBird/Assets.xcassets/close-slider.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "close-slider.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "close-slider@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "close-slider@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/close-slider.imageset/close-slider.png b/NetBird/Assets.xcassets/close-slider.imageset/close-slider.png
new file mode 100644
index 0000000..d914780
Binary files /dev/null and b/NetBird/Assets.xcassets/close-slider.imageset/close-slider.png differ
diff --git a/NetBird/Assets.xcassets/close-slider.imageset/close-slider@2x.png b/NetBird/Assets.xcassets/close-slider.imageset/close-slider@2x.png
new file mode 100644
index 0000000..e4b79e0
Binary files /dev/null and b/NetBird/Assets.xcassets/close-slider.imageset/close-slider@2x.png differ
diff --git a/NetBird/Assets.xcassets/close-slider.imageset/close-slider@3x.png b/NetBird/Assets.xcassets/close-slider.imageset/close-slider@3x.png
new file mode 100644
index 0000000..dc7ebcf
Binary files /dev/null and b/NetBird/Assets.xcassets/close-slider.imageset/close-slider@3x.png differ
diff --git a/NetBird/Assets.xcassets/close-slider@4x.imageset/Contents.json b/NetBird/Assets.xcassets/close-slider@4x.imageset/Contents.json
new file mode 100644
index 0000000..305aaf1
--- /dev/null
+++ b/NetBird/Assets.xcassets/close-slider@4x.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "close-slider@4x.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/close-slider@4x.imageset/close-slider@4x.png b/NetBird/Assets.xcassets/close-slider@4x.imageset/close-slider@4x.png
new file mode 100644
index 0000000..d0bfab5
Binary files /dev/null and b/NetBird/Assets.xcassets/close-slider@4x.imageset/close-slider@4x.png differ
diff --git a/NetBird/Assets.xcassets/exclamation-circle.imageset/Contents.json b/NetBird/Assets.xcassets/exclamation-circle.imageset/Contents.json
new file mode 100644
index 0000000..7ab160b
--- /dev/null
+++ b/NetBird/Assets.xcassets/exclamation-circle.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "exclamation-circle.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "exclamation-circle@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "exclamation-circle@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle.png b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle.png
new file mode 100644
index 0000000..9d58fed
Binary files /dev/null and b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle.png differ
diff --git a/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@2x.png b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@2x.png
new file mode 100644
index 0000000..74eb5c8
Binary files /dev/null and b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@2x.png differ
diff --git a/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@3x.png b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@3x.png
new file mode 100644
index 0000000..baad418
Binary files /dev/null and b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@3x.png differ
diff --git a/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/Contents.json b/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/Contents.json
new file mode 100644
index 0000000..cc84866
--- /dev/null
+++ b/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "exclamation-circle@4x.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/exclamation-circle@4x.png b/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/exclamation-circle@4x.png
new file mode 100644
index 0000000..ed6b0a9
Binary files /dev/null and b/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/exclamation-circle@4x.png differ
diff --git a/NetBird/Assets.xcassets/exclamation-circleY.imageset/Contents.json b/NetBird/Assets.xcassets/exclamation-circleY.imageset/Contents.json
new file mode 100644
index 0000000..1349f3d
--- /dev/null
+++ b/NetBird/Assets.xcassets/exclamation-circleY.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "exclamation-circleY.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/exclamation-circleY.imageset/exclamation-circleY.png b/NetBird/Assets.xcassets/exclamation-circleY.imageset/exclamation-circleY.png
new file mode 100644
index 0000000..d0bd0e5
Binary files /dev/null and b/NetBird/Assets.xcassets/exclamation-circleY.imageset/exclamation-circleY.png differ
diff --git a/NetBird/Assets.xcassets/hamburgerMenu.imageset/Contents.json b/NetBird/Assets.xcassets/hamburgerMenu.imageset/Contents.json
new file mode 100644
index 0000000..d6258f9
--- /dev/null
+++ b/NetBird/Assets.xcassets/hamburgerMenu.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "hamburgerMenu.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "hamburgerMenu@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "hamburgerMenu@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu.png b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu.png
new file mode 100644
index 0000000..7030fe5
Binary files /dev/null and b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu.png differ
diff --git a/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@2x.png b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@2x.png
new file mode 100644
index 0000000..0719b66
Binary files /dev/null and b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@2x.png differ
diff --git a/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@3x.png b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@3x.png
new file mode 100644
index 0000000..4f03a9e
Binary files /dev/null and b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@3x.png differ
diff --git a/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/Contents.json b/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/Contents.json
new file mode 100644
index 0000000..7a4c234
--- /dev/null
+++ b/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "hamburgerMenu@4x.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/hamburgerMenu@4x.png b/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/hamburgerMenu@4x.png
new file mode 100644
index 0000000..2843518
Binary files /dev/null and b/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/hamburgerMenu@4x.png differ
diff --git a/NetBird/Assets.xcassets/icon-empty-box.imageset/Contents.json b/NetBird/Assets.xcassets/icon-empty-box.imageset/Contents.json
new file mode 100644
index 0000000..4589796
--- /dev/null
+++ b/NetBird/Assets.xcassets/icon-empty-box.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "icon-empty-box.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/icon-empty-box.imageset/icon-empty-box.png b/NetBird/Assets.xcassets/icon-empty-box.imageset/icon-empty-box.png
new file mode 100644
index 0000000..f51c1d2
Binary files /dev/null and b/NetBird/Assets.xcassets/icon-empty-box.imageset/icon-empty-box.png differ
diff --git a/NetBird/Assets.xcassets/icon-filter-4x.imageset/Contents.json b/NetBird/Assets.xcassets/icon-filter-4x.imageset/Contents.json
new file mode 100644
index 0000000..9289e26
--- /dev/null
+++ b/NetBird/Assets.xcassets/icon-filter-4x.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "icon-filter-4x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/icon-filter-4x.imageset/icon-filter-4x.png b/NetBird/Assets.xcassets/icon-filter-4x.imageset/icon-filter-4x.png
new file mode 100644
index 0000000..5f096ba
Binary files /dev/null and b/NetBird/Assets.xcassets/icon-filter-4x.imageset/icon-filter-4x.png differ
diff --git a/NetBird/Assets.xcassets/icon-filter.imageset/Contents.json b/NetBird/Assets.xcassets/icon-filter.imageset/Contents.json
new file mode 100644
index 0000000..9ad85d2
--- /dev/null
+++ b/NetBird/Assets.xcassets/icon-filter.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "icon-filter.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "icon-filter@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "icon-filter@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter.png b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter.png
new file mode 100644
index 0000000..b3edb2b
Binary files /dev/null and b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter.png differ
diff --git a/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@2x.png b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@2x.png
new file mode 100644
index 0000000..bc70615
Binary files /dev/null and b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@2x.png differ
diff --git a/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@3x.png b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@3x.png
new file mode 100644
index 0000000..e7ab495
Binary files /dev/null and b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@3x.png differ
diff --git a/NetBird/Assets.xcassets/icon-netbird-button.imageset/Contents.json b/NetBird/Assets.xcassets/icon-netbird-button.imageset/Contents.json
new file mode 100644
index 0000000..f6774f0
--- /dev/null
+++ b/NetBird/Assets.xcassets/icon-netbird-button.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "icon-netbird-button.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "icon-netbird-button@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "icon-netbird-button@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button.png b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button.png
new file mode 100644
index 0000000..884e378
Binary files /dev/null and b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button.png differ
diff --git a/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@2x.png b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@2x.png
new file mode 100644
index 0000000..4bb45e0
Binary files /dev/null and b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@2x.png differ
diff --git a/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@3x.png b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@3x.png
new file mode 100644
index 0000000..021aed1
Binary files /dev/null and b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@3x.png differ
diff --git a/NetBird/Assets.xcassets/line.imageset/Contents.json b/NetBird/Assets.xcassets/line.imageset/Contents.json
new file mode 100644
index 0000000..25625b1
--- /dev/null
+++ b/NetBird/Assets.xcassets/line.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "line.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/line.imageset/line.png b/NetBird/Assets.xcassets/line.imageset/line.png
new file mode 100644
index 0000000..22729dc
Binary files /dev/null and b/NetBird/Assets.xcassets/line.imageset/line.png differ
diff --git a/NetBird/Assets.xcassets/logo-onboarding.imageset/Contents.json b/NetBird/Assets.xcassets/logo-onboarding.imageset/Contents.json
new file mode 100644
index 0000000..4bf1b80
--- /dev/null
+++ b/NetBird/Assets.xcassets/logo-onboarding.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "logo-onboarding.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "logo-onboarding@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "logo-onboarding@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding.png b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding.png
new file mode 100644
index 0000000..1985eb4
Binary files /dev/null and b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding.png differ
diff --git a/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@2x.png b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@2x.png
new file mode 100644
index 0000000..1dfc0ee
Binary files /dev/null and b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@2x.png differ
diff --git a/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@3x.png b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@3x.png
new file mode 100644
index 0000000..7229ef4
Binary files /dev/null and b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@3x.png differ
diff --git a/NetBird/Assets.xcassets/menu-about.imageset/Contents.json b/NetBird/Assets.xcassets/menu-about.imageset/Contents.json
new file mode 100644
index 0000000..fdb7a7e
--- /dev/null
+++ b/NetBird/Assets.xcassets/menu-about.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "menu-about.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "menu-about@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "menu-about@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/menu-about.imageset/menu-about.png b/NetBird/Assets.xcassets/menu-about.imageset/menu-about.png
new file mode 100644
index 0000000..6832818
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-about.imageset/menu-about.png differ
diff --git a/NetBird/Assets.xcassets/menu-about.imageset/menu-about@2x.png b/NetBird/Assets.xcassets/menu-about.imageset/menu-about@2x.png
new file mode 100644
index 0000000..f7ed86c
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-about.imageset/menu-about@2x.png differ
diff --git a/NetBird/Assets.xcassets/menu-about.imageset/menu-about@3x.png b/NetBird/Assets.xcassets/menu-about.imageset/menu-about@3x.png
new file mode 100644
index 0000000..dd8f117
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-about.imageset/menu-about@3x.png differ
diff --git a/NetBird/Assets.xcassets/menu-about4x.imageset/Contents.json b/NetBird/Assets.xcassets/menu-about4x.imageset/Contents.json
new file mode 100644
index 0000000..38728a7
--- /dev/null
+++ b/NetBird/Assets.xcassets/menu-about4x.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "menu-about4x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/menu-about4x.imageset/menu-about4x.png b/NetBird/Assets.xcassets/menu-about4x.imageset/menu-about4x.png
new file mode 100644
index 0000000..dd39e47
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-about4x.imageset/menu-about4x.png differ
diff --git a/NetBird/Assets.xcassets/menu-advance.imageset/Contents.json b/NetBird/Assets.xcassets/menu-advance.imageset/Contents.json
new file mode 100644
index 0000000..46dcfe9
--- /dev/null
+++ b/NetBird/Assets.xcassets/menu-advance.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "menu-advance.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "menu-advance@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "menu-advance@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance.png b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance.png
new file mode 100644
index 0000000..678fd20
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance.png differ
diff --git a/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@2x.png b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@2x.png
new file mode 100644
index 0000000..3d4f279
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@2x.png differ
diff --git a/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@3x.png b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@3x.png
new file mode 100644
index 0000000..bfbfdcb
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@3x.png differ
diff --git a/NetBird/Assets.xcassets/menu-advance4x.imageset/Contents.json b/NetBird/Assets.xcassets/menu-advance4x.imageset/Contents.json
new file mode 100644
index 0000000..19c1c05
--- /dev/null
+++ b/NetBird/Assets.xcassets/menu-advance4x.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "menu-advance4x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/menu-advance4x.imageset/menu-advance4x.png b/NetBird/Assets.xcassets/menu-advance4x.imageset/menu-advance4x.png
new file mode 100644
index 0000000..bb1368c
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-advance4x.imageset/menu-advance4x.png differ
diff --git a/NetBird/Assets.xcassets/menu-change.imageset/Contents.json b/NetBird/Assets.xcassets/menu-change.imageset/Contents.json
new file mode 100644
index 0000000..1c3abf1
--- /dev/null
+++ b/NetBird/Assets.xcassets/menu-change.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "menu-change.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "menu-change@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "menu-change@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/menu-change.imageset/menu-change.png b/NetBird/Assets.xcassets/menu-change.imageset/menu-change.png
new file mode 100644
index 0000000..e0ae5d8
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-change.imageset/menu-change.png differ
diff --git a/NetBird/Assets.xcassets/menu-change.imageset/menu-change@2x.png b/NetBird/Assets.xcassets/menu-change.imageset/menu-change@2x.png
new file mode 100644
index 0000000..4c9bcbb
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-change.imageset/menu-change@2x.png differ
diff --git a/NetBird/Assets.xcassets/menu-change.imageset/menu-change@3x.png b/NetBird/Assets.xcassets/menu-change.imageset/menu-change@3x.png
new file mode 100644
index 0000000..cf2c1f0
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-change.imageset/menu-change@3x.png differ
diff --git a/NetBird/Assets.xcassets/menu-change4x.imageset/Contents.json b/NetBird/Assets.xcassets/menu-change4x.imageset/Contents.json
new file mode 100644
index 0000000..ead1ed8
--- /dev/null
+++ b/NetBird/Assets.xcassets/menu-change4x.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "menu-change4x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/menu-change4x.imageset/menu-change4x.png b/NetBird/Assets.xcassets/menu-change4x.imageset/menu-change4x.png
new file mode 100644
index 0000000..dc66af7
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-change4x.imageset/menu-change4x.png differ
diff --git a/NetBird/Assets.xcassets/menu-faq.imageset/Contents.json b/NetBird/Assets.xcassets/menu-faq.imageset/Contents.json
new file mode 100644
index 0000000..37f10c0
--- /dev/null
+++ b/NetBird/Assets.xcassets/menu-faq.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "menu-faq.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "menu-faq@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "menu-faq@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq.png b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq.png
new file mode 100644
index 0000000..19ebddb
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq.png differ
diff --git a/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@2x.png b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@2x.png
new file mode 100644
index 0000000..f44474a
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@2x.png differ
diff --git a/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@3x.png b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@3x.png
new file mode 100644
index 0000000..5c8cbe4
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@3x.png differ
diff --git a/NetBird/Assets.xcassets/menu-faq4x.imageset/Contents.json b/NetBird/Assets.xcassets/menu-faq4x.imageset/Contents.json
new file mode 100644
index 0000000..bf15d8a
--- /dev/null
+++ b/NetBird/Assets.xcassets/menu-faq4x.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "menu-faq4x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/menu-faq4x.imageset/menu-faq4x.png b/NetBird/Assets.xcassets/menu-faq4x.imageset/menu-faq4x.png
new file mode 100644
index 0000000..c66dc97
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-faq4x.imageset/menu-faq4x.png differ
diff --git a/NetBird/Assets.xcassets/menu-reset.imageset/Contents.json b/NetBird/Assets.xcassets/menu-reset.imageset/Contents.json
new file mode 100644
index 0000000..26bd21c
--- /dev/null
+++ b/NetBird/Assets.xcassets/menu-reset.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "menu-reset.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "menu-reset@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "menu-reset@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset.png b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset.png
new file mode 100644
index 0000000..7d5c925
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset.png differ
diff --git a/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@2x.png b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@2x.png
new file mode 100644
index 0000000..cbc1369
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@2x.png differ
diff --git a/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@3x.png b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@3x.png
new file mode 100644
index 0000000..2d97f65
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@3x.png differ
diff --git a/NetBird/Assets.xcassets/menu-reset4x.imageset/Contents.json b/NetBird/Assets.xcassets/menu-reset4x.imageset/Contents.json
new file mode 100644
index 0000000..0a71da6
--- /dev/null
+++ b/NetBird/Assets.xcassets/menu-reset4x.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "menu-reset4x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/menu-reset4x.imageset/menu-reset4x.png b/NetBird/Assets.xcassets/menu-reset4x.imageset/menu-reset4x.png
new file mode 100644
index 0000000..7a34e2d
Binary files /dev/null and b/NetBird/Assets.xcassets/menu-reset4x.imageset/menu-reset4x.png differ
diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/Contents.json b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/Contents.json
new file mode 100644
index 0000000..31fff9e
--- /dev/null
+++ b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/Contents.json
@@ -0,0 +1,56 @@
+{
+ "images" : [
+ {
+ "filename" : "netbird-logo-menu.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "netbird-logo-menu 1.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "netbird-logo-menu@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "netbird-logo-menu@2x 1.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "netbird-logo-menu@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "netbird-logo-menu@3x 1.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu 1.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu 1.png
new file mode 100644
index 0000000..3119611
Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu 1.png differ
diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu.png
new file mode 100644
index 0000000..63eed5a
Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu.png differ
diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x 1.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x 1.png
new file mode 100644
index 0000000..020daa6
Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x 1.png differ
diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x.png
new file mode 100644
index 0000000..8035730
Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x.png differ
diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x 1.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x 1.png
new file mode 100644
index 0000000..f98e90e
Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x 1.png differ
diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x.png
new file mode 100644
index 0000000..7e139f3
Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x.png differ
diff --git a/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/Contents.json b/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/Contents.json
new file mode 100644
index 0000000..3deacfb
--- /dev/null
+++ b/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "netbird-logo-menu@4x.png",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/netbird-logo-menu@4x.png b/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/netbird-logo-menu@4x.png
new file mode 100644
index 0000000..3b27ea9
Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/netbird-logo-menu@4x.png differ
diff --git a/NetBird/Assets.xcassets/onboarding.imageset/Contents.json b/NetBird/Assets.xcassets/onboarding.imageset/Contents.json
new file mode 100644
index 0000000..e67e783
--- /dev/null
+++ b/NetBird/Assets.xcassets/onboarding.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "onboarding.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/onboarding.imageset/onboarding.png b/NetBird/Assets.xcassets/onboarding.imageset/onboarding.png
new file mode 100644
index 0000000..ae4ed2b
Binary files /dev/null and b/NetBird/Assets.xcassets/onboarding.imageset/onboarding.png differ
diff --git a/NetBird/Assets.xcassets/search-4x.imageset/Contents.json b/NetBird/Assets.xcassets/search-4x.imageset/Contents.json
new file mode 100644
index 0000000..63817b8
--- /dev/null
+++ b/NetBird/Assets.xcassets/search-4x.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "search-4x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/search-4x.imageset/search-4x.png b/NetBird/Assets.xcassets/search-4x.imageset/search-4x.png
new file mode 100644
index 0000000..5f51bed
Binary files /dev/null and b/NetBird/Assets.xcassets/search-4x.imageset/search-4x.png differ
diff --git a/NetBird/Assets.xcassets/search.imageset/Contents.json b/NetBird/Assets.xcassets/search.imageset/Contents.json
new file mode 100644
index 0000000..794d658
--- /dev/null
+++ b/NetBird/Assets.xcassets/search.imageset/Contents.json
@@ -0,0 +1,22 @@
+{
+ "images" : [
+ {
+ "filename" : "search-1x.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "search-2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Assets.xcassets/search.imageset/search-1x.png b/NetBird/Assets.xcassets/search.imageset/search-1x.png
new file mode 100644
index 0000000..b13b071
Binary files /dev/null and b/NetBird/Assets.xcassets/search.imageset/search-1x.png differ
diff --git a/NetBird/Assets.xcassets/search.imageset/search-2x.png b/NetBird/Assets.xcassets/search.imageset/search-2x.png
new file mode 100644
index 0000000..ffbc0a1
Binary files /dev/null and b/NetBird/Assets.xcassets/search.imageset/search-2x.png differ
diff --git a/NetBird/Assets/Preview Content/Preview Assets.xcassets/Contents.json b/NetBird/Assets/Preview Content/Preview Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/NetBird/Assets/Preview Content/Preview Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/NetBird/Info.plist b/NetBird/Info.plist
new file mode 100644
index 0000000..0c67376
--- /dev/null
+++ b/NetBird/Info.plist
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/NetBird/NetBird.entitlements b/NetBird/NetBird.entitlements
new file mode 100644
index 0000000..476b633
--- /dev/null
+++ b/NetBird/NetBird.entitlements
@@ -0,0 +1,14 @@
+
+
+
+
+ com.apple.developer.networking.networkextension
+
+ packet-tunnel-provider
+
+ com.apple.security.application-groups
+
+ group.io.netbird.app
+
+
+
diff --git a/NetBird/Source/App/NetBirdApp.swift b/NetBird/Source/App/NetBirdApp.swift
new file mode 100644
index 0000000..f7a6932
--- /dev/null
+++ b/NetBird/Source/App/NetBirdApp.swift
@@ -0,0 +1,44 @@
+//
+// NetBirdiOSApp.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 01.08.23.
+//
+
+import SwiftUI
+import FirebaseCore
+import FirebasePerformance
+
+class AppDelegate: NSObject, UIApplicationDelegate {
+ func application(_ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
+ let options = FirebaseOptions(contentsOfFile: Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!)
+ FirebaseApp.configure(options: options!)
+ return true
+ }
+}
+
+
+@main
+struct NetBirdApp: App {
+ @StateObject var viewModel = ViewModel()
+ @Environment(\.scenePhase) var scenePhase
+
+ @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
+
+ var body: some Scene {
+ WindowGroup {
+ MainView()
+ .environmentObject(viewModel)
+ .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) {_ in
+ print("App is active!")
+ viewModel.checkExtensionState()
+ viewModel.startPollingDetails()
+ }
+ .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) {_ in
+ print("App is inactive!")
+ viewModel.stopPollingDetails()
+ }
+ }
+ }
+}
diff --git a/NetBird/Source/App/ViewModels/MainViewModel.swift b/NetBird/Source/App/ViewModels/MainViewModel.swift
new file mode 100644
index 0000000..1f2c563
--- /dev/null
+++ b/NetBird/Source/App/ViewModels/MainViewModel.swift
@@ -0,0 +1,239 @@
+//
+// MainViewModel.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 01.08.23.
+//
+
+import UIKit
+import NetworkExtension
+import os
+import Combine
+
+@MainActor
+class ViewModel: ObservableObject {
+ @Published var networkExtensionAdapter = NetworkExtensionAdapter()
+ @Published var showSetupKeyPopup = false
+ @Published var showChangeServerAlert = false
+ @Published var showInvalidServerAlert = false
+ @Published var showInvalidSetupKeyHint = false
+ @Published var showInvalidSetupKeyAlert = false
+ @Published var showInvalidPresharedKeyAlert = false
+ @Published var showServerChangedInfo = false
+ @Published var showPreSharedKeyChangedInfo = false
+ @Published var showCopiedAlert = false
+ @Published var showCopiedInfoAlert = false
+ @Published var showAuthenticationRequired = false
+ @Published var presentSideDrawer = false
+ @Published var extensionState : NEVPNStatus = .disconnected
+ @Published var navigateToServerView = false
+ @Published var managementURL = ""
+ @Published var presharedKey = ""
+ @Published var server: String = ""
+ @Published var setupKey: String = ""
+ @Published var presharedKeySecure = true
+ @Published var statusDetails = StatusDetails(ip: "", fqdn: "", managementStatus: .disconnected, peerInfo: [])
+ @Published var statusDetailsValid = false
+ @Published var extensionStateText = "Disconnected"
+ @Published var connectPressed = false
+ @Published var disconnectPressed = false
+ var preferences = Preferences.newPreferences()
+ var buttonLock = false
+ let defaults = UserDefaults.standard
+ @Published var fqdn = UserDefaults.standard.string(forKey: "fqdn") ?? ""
+ @Published var ip = UserDefaults.standard.string(forKey: "ip") ?? ""
+
+ private var cancellables = Set()
+
+ init() {
+ $server
+ .removeDuplicates()
+ .debounce(for: .seconds(0.5), scheduler: RunLoop.main)
+ .map { server in
+ !self.isValidURL(server)
+ }
+ .assign(to: &$showInvalidServerAlert)
+
+ $setupKey
+ .removeDuplicates()
+ .debounce(for: .seconds(0.5), scheduler: RunLoop.main)
+ .map { setupKey in
+ !self.isValidSetupKey(setupKey)
+ }
+ .assign(to: &$showInvalidSetupKeyHint)
+ }
+
+ func connect() {
+ self.connectPressed = true
+ print("Connected pressed set to true")
+ DispatchQueue.main.async {
+ print("starting extension")
+ self.buttonLock = true
+ DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
+ self.buttonLock = false
+ }
+ Task {
+ await self.networkExtensionAdapter.start()
+ print("Connected pressed set to false")
+ }
+ }
+ }
+
+ func close() -> Void {
+ self.disconnectPressed = true
+ DispatchQueue.main.async {
+ print("Stopping extension")
+ self.buttonLock = true
+ DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
+ self.buttonLock = false
+ }
+ self.networkExtensionAdapter.stop()
+ }
+ }
+
+ func startPollingDetails() {
+ networkExtensionAdapter.startTimer { details in
+ let sortedPeerInfo = details.peerInfo.sorted(by: { a, b in
+ a.ip < b.ip
+ })
+
+ self.checkExtensionState()
+ if self.extensionState == .disconnected && self.extensionStateText == "Connected" {
+ self.showAuthenticationRequired = true
+ self.extensionStateText = "Disconnected"
+ }
+
+ let newStatusDetails = StatusDetails(ip: details.ip, fqdn: details.fqdn, managementStatus: details.managementStatus, peerInfo: sortedPeerInfo)
+ if newStatusDetails.ip != self.statusDetails.ip || newStatusDetails.fqdn != self.statusDetails.fqdn || newStatusDetails.managementStatus != self.statusDetails.managementStatus || !newStatusDetails.peerInfo.elementsEqual(self.statusDetails.peerInfo, by: { a, b in
+ a.ip == b.ip && a.connStatus == b.connStatus
+ }) {
+ if !newStatusDetails.fqdn.isEmpty && newStatusDetails.fqdn != self.statusDetails.fqdn {
+ self.defaults.set(newStatusDetails.fqdn, forKey: "fqdn")
+ self.fqdn = details.fqdn
+
+ }
+ if !newStatusDetails.ip.isEmpty && newStatusDetails.ip != self.statusDetails.ip {
+ self.defaults.set(newStatusDetails.ip, forKey: "ip")
+ self.ip = details.ip
+ }
+
+ print("Status: \(newStatusDetails.managementStatus) - Extension: \(self.extensionState) - LoginRequired: \(self.networkExtensionAdapter.isLoginRequired())")
+ if newStatusDetails.managementStatus == .disconnected && self.extensionState == .connected && self.networkExtensionAdapter.isLoginRequired() {
+ self.networkExtensionAdapter.stop()
+ self.showAuthenticationRequired = true
+ }
+ self.statusDetails = newStatusDetails
+ }
+ self.statusDetailsValid = true
+ }
+ }
+
+ func stopPollingDetails() {
+ networkExtensionAdapter.stopTimer()
+ }
+
+ func checkExtensionState() {
+ networkExtensionAdapter.getExtensionStatus { status in
+ let statuses : [NEVPNStatus] = [.connected, .disconnected, .connecting, .disconnecting]
+ DispatchQueue.main.async {
+ if statuses.contains(status) && self.extensionState != status {
+ print("Changing extension status")
+ self.extensionState = status
+ }
+ }
+ }
+ }
+
+ func updateManagementURL(url: String) -> Bool? {
+ let trimmedURL = url.trimmingCharacters(in: .whitespacesAndNewlines)
+ let newAuth = NetBirdSDKNewAuth(Preferences.configFile(), trimmedURL, nil)
+ self.managementURL = trimmedURL
+ var ssoSupported: ObjCBool = false
+ do {
+ try newAuth?.saveConfigIfSSOSupported(&ssoSupported)
+ if ssoSupported.boolValue {
+ print("SSO is supported")
+ return true
+ } else {
+ print("SSO is not supported. Fallback to setup key")
+ return false
+ }
+ } catch {
+ print("Failed to check SSO support")
+ }
+ return nil
+ }
+
+ func clearDetails() {
+ self.ip = ""
+ self.fqdn = ""
+ defaults.removeObject(forKey: "ip")
+ defaults.removeObject(forKey: "fqdn")
+ }
+
+ func setSetupKey(key: String) throws {
+ let newAuth = NetBirdSDKNewAuth(Preferences.configFile(), self.managementURL, nil)
+ try newAuth?.login(withSetupKeyAndSaveConfig: key, deviceName: Device.getName())
+ self.managementURL = ""
+ }
+
+ func updatePreSharedKey() {
+ preferences.setPreSharedKey(presharedKey)
+ do {
+ try preferences.commit()
+ self.close()
+ self.presharedKeySecure = true
+ self.presentSideDrawer = false
+ self.showPreSharedKeyChangedInfo = true
+ } catch {
+ print("Failed to update preshared key")
+ }
+ }
+
+ func removePreSharedKey() {
+ presharedKey = ""
+ preferences.setPreSharedKey(presharedKey)
+ do {
+ try preferences.commit()
+ self.close()
+ self.presharedKeySecure = false
+ } catch {
+ print("Failed to remove preshared key")
+ }
+ }
+
+ func loadPreSharedKey() {
+ self.presharedKey = preferences.getPreSharedKey(nil)
+ self.presharedKeySecure = self.presharedKey != ""
+ }
+
+ func getDefaultStatus() -> StatusDetails {
+ return StatusDetails(ip: "", fqdn: "", managementStatus: .disconnected, peerInfo: [])
+ }
+
+ func isValidURL(_ string: String) -> Bool {
+ let trimmedString = string.trimmingCharacters(in: .whitespacesAndNewlines)
+ if trimmedString.isEmpty { return true }
+
+ let pattern = "^(?i)https?://(([a-zA-Z\\d]([a-zA-Z\\d-]{0,61}[a-zA-Z\\d])?\\.)*[a-zA-Z]{2,})(?::\\d{1,5})?(?:/|$)"
+
+ let isMatch = trimmedString.range(of: pattern, options: .regularExpression, range: nil, locale: nil) != nil
+ return isMatch
+ }
+
+ func isValidSetupKey(_ string: String) -> Bool {
+ if string.isEmpty { return true }
+ let pattern = "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$"
+ let isMatch = string.range(of: pattern, options: .regularExpression, range: nil, locale: nil) != nil
+ return isMatch
+ }
+}
+
+func printLogContents(from logURL: URL) {
+ do {
+ let logContents = try String(contentsOf: logURL, encoding: .utf8)
+ print(logContents)
+ } catch {
+ print("Failed to read the log file: \(error.localizedDescription)")
+ }
+}
diff --git a/NetBird/Source/App/Views/AboutView.swift b/NetBird/Source/App/Views/AboutView.swift
new file mode 100644
index 0000000..4bab2e0
--- /dev/null
+++ b/NetBird/Source/App/Views/AboutView.swift
@@ -0,0 +1,58 @@
+//
+// AboutView.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 01.08.23.
+//
+
+import SwiftUI
+
+struct AboutView: View {
+
+ @Environment(\.presentationMode) var presentationMode: Binding
+
+ var body: some View {
+ ZStack {
+ Color("BgPage")
+ .edgesIgnoringSafeArea(.bottom)
+ VStack {
+ Image("netbird-logo-menu")
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: UIScreen.main.bounds.width * 0.4)
+ .padding(.top, UIScreen.main.bounds.height * 0.05)
+ .padding(.bottom, UIScreen.main.bounds.height * 0.04)
+ HStack {
+ Text("Version")
+ .font(.system(size: 18, weight: .medium))
+ .foregroundColor(Color("TextPrimary"))
+ Text("\(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "unknown")")
+ .font(.system(size: 18, weight: .regular))
+ .foregroundColor(Color("TextPrimary"))
+ }
+ .padding(.bottom, UIScreen.main.bounds.height * 0.04)
+ Link("License agreement", destination: URL(string: "https://netbird.io/terms")!)
+ .padding(.bottom, UIScreen.main.bounds.height * 0.04)
+ .font(.system(size: 18, weight: .medium))
+ Link("Privacy policy", destination: URL(string: "https://netbird.io/privacy")!)
+ .font(.system(size: 18, weight: .medium))
+ Spacer()
+ Text("© 2023 NetBird all rights reserved")
+ .foregroundColor(Color.white)
+ .padding(.bottom, UIScreen.main.bounds.height * 0.01)
+ }
+ }
+ .navigationViewStyle(StackNavigationViewStyle())
+ .navigationBarTitleDisplayMode(.inline)
+ .navigationBarBackButtonHidden(true)
+ .navigationBarItems(leading: CustomBackButton(text: "About", action: {
+ presentationMode.wrappedValue.dismiss()
+ }))
+ }
+}
+
+struct AboutView_Previews: PreviewProvider {
+ static var previews: some View {
+ AboutView()
+ }
+}
diff --git a/NetBird/Source/App/Views/AdvancedView.swift b/NetBird/Source/App/Views/AdvancedView.swift
new file mode 100644
index 0000000..2706369
--- /dev/null
+++ b/NetBird/Source/App/Views/AdvancedView.swift
@@ -0,0 +1,94 @@
+//
+// AdvancedView.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 01.08.23.
+//
+
+import SwiftUI
+
+struct AdvancedView: View {
+ @EnvironmentObject var viewModel: ViewModel
+ @Environment(\.presentationMode) var presentationMode: Binding
+
+ var body: some View {
+ ZStack {
+ Color("BgPage")
+ .edgesIgnoringSafeArea(.bottom)
+ VStack (alignment: .leading){
+ Text("Add a pre-shared key")
+ .font(.system(size: 18, weight: .bold))
+ .foregroundColor(Color("TextPrimary"))
+ .padding(.top, UIScreen.main.bounds.height * 0.04)
+ Text("You will only communicate with peers that use the same key.")
+ .multilineTextAlignment(.leading)
+ .font(.system(size: 18, weight: .regular))
+ .foregroundColor(Color("TextSecondary"))
+ .padding(.top, 3)
+ CustomTextField(placeholder: "Add a pre-shared key", text: $viewModel.presharedKey, secure: $viewModel.presharedKeySecure)
+ .padding(.top, 3)
+ .onChange(of: viewModel.presharedKey, perform: { value in
+ checkForValidPresharedKey(text: value)
+ })
+ if viewModel.showInvalidPresharedKeyAlert {
+ Text("Invalid key").foregroundColor(.red)
+ }
+ SolidButton(text: viewModel.presharedKeySecure ? "Remove" : "Save") {
+ if !viewModel.showInvalidPresharedKeyAlert {
+ if viewModel.presharedKeySecure {
+ viewModel.removePreSharedKey() // TODO: might replace this with new implememented removal
+ } else {
+ viewModel.updatePreSharedKey()
+ print("save preshared key")
+ self.presentationMode.wrappedValue.dismiss()
+ }
+ }
+ }
+ .padding(.top, 5)
+ Spacer()
+ }
+ .padding([.leading, .trailing], UIScreen.main.bounds.width * 0.10)
+ }
+ .onAppear(perform: {
+ viewModel.loadPreSharedKey()
+ })
+ .navigationViewStyle(StackNavigationViewStyle())
+ .navigationBarTitleDisplayMode(.inline)
+ .navigationBarBackButtonHidden(true)
+ .navigationBarItems(leading: CustomBackButton(text: "Advanced", action: {
+ presentationMode.wrappedValue.dismiss()
+ }))
+ .onTapGesture {
+ UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
+ }
+ }
+
+ func checkForValidPresharedKey(text: String) {
+ if isValidBase64EncodedString(text) {
+ viewModel.showInvalidPresharedKeyAlert = false
+ } else {
+ viewModel.showInvalidPresharedKeyAlert = true
+ }
+ }
+
+ func isValidBase64EncodedString(_ input: String) -> Bool {
+ // Allow empty string as valid input
+ if input.isEmpty {
+ return true
+ }
+
+ // Check if the string is valid Base64
+ guard let data = Data(base64Encoded: input) else {
+ return false
+ }
+
+ // Check if the decoded data is 32 bytes (256 bits)
+ return data.count == 32
+ }
+}
+
+struct AdvancedView_Previews: PreviewProvider {
+ static var previews: some View {
+ AdvancedView()
+ }
+}
diff --git a/NetBird/Source/App/Views/Components/BottomDrawer.swift b/NetBird/Source/App/Views/Components/BottomDrawer.swift
new file mode 100644
index 0000000..c7cc8c7
--- /dev/null
+++ b/NetBird/Source/App/Views/Components/BottomDrawer.swift
@@ -0,0 +1,20 @@
+//
+// BottomDrawer.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 01.08.23.
+//
+
+import SwiftUI
+
+struct BottomDrawer: View {
+ var body: some View {
+ Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
+ }
+}
+
+struct BottomDrawer_Previews: PreviewProvider {
+ static var previews: some View {
+ BottomDrawer()
+ }
+}
diff --git a/NetBird/Source/App/Views/Components/CustomBackButton.swift b/NetBird/Source/App/Views/Components/CustomBackButton.swift
new file mode 100644
index 0000000..5e27c98
--- /dev/null
+++ b/NetBird/Source/App/Views/Components/CustomBackButton.swift
@@ -0,0 +1,27 @@
+//
+// CustomBackButton.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 01.08.23.
+//
+
+import SwiftUI
+
+struct CustomBackButton: View {
+ var text : String
+ var action: () -> Void
+
+ var body: some View {
+ Button(action: {
+ action()
+ }) {
+ HStack {
+ Image("chevron.left")
+ Text(text)
+ .padding(.leading, 5)
+ .font(.system(size: 26, weight: .regular))
+ .foregroundColor(Color("TextPrimary"))
+ }
+ }
+ }
+}
diff --git a/NetBird/Source/App/Views/Components/CustomLottieView.swift b/NetBird/Source/App/Views/Components/CustomLottieView.swift
new file mode 100644
index 0000000..6400a00
--- /dev/null
+++ b/NetBird/Source/App/Views/Components/CustomLottieView.swift
@@ -0,0 +1,183 @@
+import Foundation
+import SwiftUI
+import Lottie
+import NetworkExtension
+
+struct CustomLottieView: UIViewRepresentable {
+ @Environment(\.colorScheme) var colorScheme
+ @Binding var extensionStatus: NEVPNStatus
+ @Binding var engineStatus: ClientState
+ @Binding var connectPressed: Bool
+ @Binding var disconnectPressed: Bool
+ @StateObject var viewModel: ViewModel
+
+ func makeUIView(context: Context) -> LottieAnimationView {
+ let animationView = LottieAnimationView()
+ animationView.animation = LottieAnimation.named(colorScheme == .dark ? "button-full2-dark" : "button-full2")
+ context.coordinator.colorScheme = colorScheme
+ animationView.contentMode = .scaleAspectFit
+ return animationView
+ }
+
+ func updateUIView(_ uiView: LottieAnimationView, context: Context) {
+ // Status change check
+ if context.coordinator.extensionStatus != extensionStatus || context.coordinator.engineStatus != engineStatus
+ || context.coordinator.connectPressed != connectPressed || context.coordinator.disconnectPressed != disconnectPressed {
+ // Update the coordinator's state
+ context.coordinator.extensionStatus = extensionStatus
+ context.coordinator.engineStatus = engineStatus
+ context.coordinator.connectPressed = connectPressed
+ context.coordinator.disconnectPressed = disconnectPressed
+
+ if context.coordinator.isPlaying {
+ print("Is still playing")
+ return
+ }
+ // Act based on the new status
+ switch extensionStatus {
+ case .connected:
+ print("Management status chnaged to \(engineStatus)")
+ if disconnectPressed {
+ DispatchQueue.main.async {
+ context.coordinator.playDisconnectingFadeIn(uiView: uiView, viewModel: viewModel)
+ }
+ }
+ switch engineStatus {
+ case .connected:
+ DispatchQueue.main.async {
+ viewModel.extensionStateText = "Connected"
+ }
+ uiView.currentFrame = context.coordinator.connectedFrame
+ case .connecting:
+ context.coordinator.playConnectingLoop(uiView: uiView, viewModel: viewModel)
+ case .disconnected:
+ break
+ case .disconnecting:
+ break
+ }
+ case .disconnected:
+ if connectPressed {
+ DispatchQueue.main.async {
+ context.coordinator.playConnectingFadeIn(uiView: uiView, viewModel: viewModel)
+ }
+ }
+ DispatchQueue.main.async {
+ viewModel.extensionStateText = "Disconnected"
+ }
+ uiView.currentFrame = context.coordinator.disconnectedFrame
+ case .connecting:
+ DispatchQueue.main.async {
+ context.coordinator.playConnectingFadeIn(uiView: uiView, viewModel: viewModel)
+ }
+ case .disconnecting:
+ DispatchQueue.main.async {
+ context.coordinator.playDisconnectingFadeIn(uiView: uiView, viewModel: viewModel)
+ }
+ default:
+ break
+ }
+ }
+ }
+
+ func makeCoordinator() -> Coordinator {
+ Coordinator()
+ }
+
+ class Coordinator: NSObject {
+ var isPlaying = false
+ var extensionStatus: NEVPNStatus?
+ var engineStatus: ClientState?
+ var connectPressed: Bool?
+ var disconnectPressed: Bool?
+ var colorScheme: ColorScheme?
+
+ let connectedFrame: CGFloat = 142
+ let disconnectedFrame: CGFloat = 339
+ let connectingFadeIn: (startFrame: CGFloat, endFrame: CGFloat) = (0, 78)
+ let connectingLoopRange: (startFrame: CGFloat, endFrame: CGFloat) = (78, 120)
+ let connectingFadeOut: (startFrame: CGFloat, endFrame: CGFloat) = (121, 142)
+ let disconnectingLoopFadeIn: (startFrame: CGFloat, endFrame: CGFloat) = (152, 214)
+ let disconnectingLoopRange: (startFrame: CGFloat, endFrame: CGFloat) = (215, 258)
+ let disconnectingFadeOut: (startFrame: CGFloat, endFrame: CGFloat) = (259, 339)
+
+
+ func playConnectingFadeIn(uiView: LottieAnimationView, viewModel: ViewModel) {
+ DispatchQueue.main.async {
+ viewModel.extensionStateText = "Connecting..."
+ }
+ self.isPlaying = true
+ uiView.play(fromFrame: connectingFadeIn.startFrame, toFrame: connectingFadeIn.endFrame, loopMode: .playOnce) { [weak self] finished in
+ guard let self = self else { return }
+ if self.engineStatus == .connected {
+ self.playFadeOut(uiView: uiView, startFrame: self.connectingFadeOut.startFrame, endFrame: self.connectingFadeOut.endFrame, viewModel: viewModel, extensionStateText: "Connected")
+ } else {
+ // Loop the connecting animation only if the status is still connecting
+ playConnectingLoop(uiView: uiView, viewModel: viewModel)
+ }
+ }
+ }
+
+ func playConnectingLoop(uiView: LottieAnimationView, viewModel: ViewModel) {
+ self.isPlaying = true
+ DispatchQueue.main.async {
+ viewModel.extensionStateText = "Connecting..."
+ }
+ uiView.play(fromFrame: self.connectingLoopRange.startFrame, toFrame: self.connectingLoopRange.endFrame, loopMode: .playOnce) {[weak self] finished in
+ guard let self = self else { return }
+ if self.engineStatus == .connected {
+ self.playFadeOut(uiView: uiView, startFrame: self.connectingFadeOut.startFrame, endFrame: self.connectingFadeOut.endFrame, viewModel: viewModel, extensionStateText: "Connected")
+ } else if (self.engineStatus == .disconnecting || self.extensionStatus == .disconnecting || self.engineStatus == .disconnected || self.extensionStatus == .disconnected) && !(self.connectPressed ?? false) {
+ print("Connected pressed = \(self.connectPressed?.description)")
+ self.playDisconnectingLoop(uiView: uiView, viewModel: viewModel)
+ } else {
+ playConnectingLoop(uiView: uiView, viewModel: viewModel)
+ }
+ }
+ }
+
+ func playDisconnectingFadeIn(uiView: LottieAnimationView, viewModel: ViewModel) {
+ self.isPlaying = true
+ DispatchQueue.main.async {
+ viewModel.extensionStateText = "Disconnecting..."
+ }
+ uiView.play(fromFrame: disconnectingLoopFadeIn.startFrame, toFrame: disconnectingLoopFadeIn.endFrame, loopMode: .playOnce) { [weak self] finished in
+ guard let self = self else { return }
+ if self.extensionStatus == .disconnected {
+ self.playFadeOut(uiView: uiView, startFrame: self.disconnectingFadeOut.startFrame, endFrame: self.disconnectingFadeOut.endFrame, viewModel: viewModel, extensionStateText: "Disconnected")
+ } else {
+ DispatchQueue.main.async {
+ viewModel.connectPressed = false
+ }
+ playDisconnectingLoop(uiView: uiView, viewModel: viewModel)
+ }
+ }
+ }
+
+ func playDisconnectingLoop(uiView: LottieAnimationView, viewModel: ViewModel) {
+ self.isPlaying = true
+ DispatchQueue.main.async {
+ viewModel.extensionStateText = "Disconnecting..."
+ }
+ uiView.play(fromFrame: self.disconnectingLoopRange.startFrame, toFrame: self.disconnectingLoopRange.endFrame, loopMode: .playOnce) { [weak self] finished in
+ guard let self = self else { return }
+ if self.extensionStatus == .disconnected {
+ self.playFadeOut(uiView: uiView, startFrame: self.disconnectingFadeOut.startFrame, endFrame: self.disconnectingFadeOut.endFrame, viewModel: viewModel, extensionStateText: "Disconnected")
+ } else {
+ playDisconnectingLoop(uiView: uiView, viewModel: viewModel)
+ }
+ }
+ }
+
+ func playFadeOut(uiView: LottieAnimationView, startFrame: CGFloat, endFrame: CGFloat, viewModel: ViewModel, extensionStateText: String) {
+ self.isPlaying = true
+ uiView.play(fromFrame: startFrame, toFrame: endFrame, loopMode: .playOnce) { [weak self] finished in
+ DispatchQueue.main.async {
+ self?.isPlaying = false
+ viewModel.extensionStateText = extensionStateText
+ viewModel.connectPressed = false
+ viewModel.disconnectPressed = false
+ }
+ }
+ }
+ }
+}
diff --git a/NetBird/Source/App/Views/Components/CustomTextField.swift b/NetBird/Source/App/Views/Components/CustomTextField.swift
new file mode 100644
index 0000000..dd3f112
--- /dev/null
+++ b/NetBird/Source/App/Views/Components/CustomTextField.swift
@@ -0,0 +1,42 @@
+//
+// CustomTextField.swift
+// NetBird
+//
+// Created by Pascal Fischer on 06.11.23.
+//
+
+import SwiftUI
+
+struct CustomTextField: View {
+ var placeholder: String
+ @Binding var text: String
+ @Binding var secure: Bool
+ var foregroundColor: Color = .primary
+ var cornerRadius: CGFloat = 8.0
+ var borderColor: Color = Color("BorderTextField")
+ var borderWidth: CGFloat = 1.0
+ var height: CGFloat = 36.0
+
+ var body: some View {
+ ZStack {
+ RoundedRectangle(cornerRadius: cornerRadius)
+ .fill(Color("BgTextField"))
+ .frame(height: height)
+ .overlay(
+ RoundedRectangle(cornerRadius: cornerRadius)
+ .stroke(borderColor, lineWidth: borderWidth)
+ )
+ if secure {
+ SecureField(placeholder, text: $text)
+ .foregroundColor(foregroundColor)
+ .padding(.horizontal, 8)
+ .disabled(true)
+ } else {
+ TextField(placeholder, text: $text)
+ .foregroundColor(foregroundColor)
+ .padding(.horizontal, 8)
+ }
+ }
+ }
+}
+
diff --git a/NetBird/Source/App/Views/Components/PeerCard.swift b/NetBird/Source/App/Views/Components/PeerCard.swift
new file mode 100644
index 0000000..89e2765
--- /dev/null
+++ b/NetBird/Source/App/Views/Components/PeerCard.swift
@@ -0,0 +1,35 @@
+//
+// PeerCard.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 10.10.23.
+//
+
+import SwiftUI
+
+struct PeerCard: View {
+ var peer: PeerInfo
+
+ var body: some View {
+ HStack {
+ HStack {
+ RoundedRectangle(cornerRadius: 8)
+ .fill(peer.connStatus == "Connected" ? Color.green : Color.gray.opacity(0.5))
+ .frame(width: 8, height: 40)
+ VStack(alignment: .leading, content: {
+ Text(peer.fqdn).padding(.bottom, 1).foregroundColor(Color("TextPeerCard"))
+ Text(peer.ip).foregroundColor(Color("TextPeerCard"))
+ }).padding(.leading, 5)
+ Spacer()
+ Text(peer.connStatus).foregroundColor(Color("TextPeerCard")).padding(.leading, 3)
+ }
+ .padding()
+ }.background(
+ Color("BgPeerCard")
+ )
+ }
+}
+
+#Preview {
+ PeerCard(peer: PeerInfo(ip: "123.123.123.123", fqdn: "iPhone.netbird.cloud", connStatus: "Connected"))
+}
diff --git a/NetBird/Source/App/Views/Components/SafariView.swift b/NetBird/Source/App/Views/Components/SafariView.swift
new file mode 100644
index 0000000..9a83afa
--- /dev/null
+++ b/NetBird/Source/App/Views/Components/SafariView.swift
@@ -0,0 +1,50 @@
+import SwiftUI
+import SafariServices
+
+struct SafariView: UIViewControllerRepresentable {
+ @Binding var isPresented: Bool
+ let url: URL
+ let didFinish: () -> Void
+
+ func makeUIViewController(context: Context) -> SFSafariViewController {
+ let controller = SFSafariViewController(url: url)
+ controller.delegate = context.coordinator
+ return controller
+ }
+
+ func updateUIViewController(_ uiViewController: SFSafariViewController, context: Context) {}
+
+ func makeCoordinator() -> Coordinator {
+ Coordinator(self)
+ }
+
+ class Coordinator: NSObject, SFSafariViewControllerDelegate {
+ let parent: SafariView
+
+ init(_ parent: SafariView) {
+ self.parent = parent
+ }
+
+ func safariViewController(_ controller: SFSafariViewController, initialLoadDidRedirectTo URL: URL) {
+ print("Url is: \(URL.absoluteString)")
+ if isSuccessURL(URL.absoluteString) {
+ DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
+ self.parent.isPresented = false
+ self.parent.didFinish()
+ }
+ }
+ }
+
+ func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
+ parent.isPresented = false
+ parent.didFinish()
+ }
+
+ func isSuccessURL(_ string: String) -> Bool {
+ if string.isEmpty { return true }
+ let pattern = "^(http|https)://(localhost:53000/\\?code=.*|[a-zA-Z0-9.-]+/device/success)$"
+ let isMatch = string.range(of: pattern, options: .regularExpression, range: nil, locale: nil) != nil
+ return isMatch
+ }
+ }
+}
diff --git a/NetBird/Source/App/Views/Components/SideDrawer.swift b/NetBird/Source/App/Views/Components/SideDrawer.swift
new file mode 100644
index 0000000..74a84d3
--- /dev/null
+++ b/NetBird/Source/App/Views/Components/SideDrawer.swift
@@ -0,0 +1,143 @@
+//
+// SideDrawer.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 01.08.23.
+//
+
+import SwiftUI
+
+struct SideDrawer: View {
+ @StateObject var viewModel: ViewModel
+ @Binding var isShowing: Bool
+ var edgeTransition: AnyTransition = .move(edge: .leading)
+
+ var body: some View {
+ ZStack(alignment: .leading) {
+ if (isShowing) {
+ Color.black
+ .opacity(0.3)
+ .ignoresSafeArea()
+ .onTapGesture {
+ isShowing.toggle()
+ }
+ SideMenu(viewModel: viewModel)
+ .transition(edgeTransition)
+ .background(
+ Color.clear
+ )
+ }
+ }
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom)
+ .ignoresSafeArea()
+ .animation(.easeInOut, value: isShowing)
+ }
+}
+
+struct SideMenu: View {
+ @StateObject var viewModel: ViewModel
+
+ let isIpad = UIDevice.current.userInterfaceIdiom == .pad
+
+ var body: some View {
+ ZStack (alignment: .leading) {
+ Rectangle()
+ .fill(Color("BgSideDrawer"))
+ .frame(width: UIScreen.main.bounds.width * (isIpad ? 0.4 : 0.7))
+ .shadow(color: .black.opacity(0.1), radius: 5, x: 0, y: 3)
+ VStack(alignment: .leading, spacing: UIScreen.main.bounds.width * 0.05) {
+ HStack {
+ Spacer()
+ Image("netbird-logo-menu")
+ Spacer()
+ }
+ .padding(.top, UIScreen.main.bounds.height * 0.05)
+ .padding(.bottom, UIScreen.main.bounds.height * 0.11)
+ Group {
+ NavigationLink {
+ AdvancedView()
+ } label: {
+ HStack{
+ Image("menu-advance")
+ .resizable()
+ .scaledToFit()
+ .frame(width: 30)
+ .padding(.trailing, 5)
+ Text("Advanced")
+ .font(.system(size: 20, weight: .regular))
+ .foregroundColor(Color("TextPrimary"))
+ }
+ .padding(.bottom, UIScreen.main.bounds.height * 0.07)
+ }
+ NavigationLink {
+ AboutView()
+ } label: {
+ HStack{
+ Image("menu-about")
+ .resizable()
+ .scaledToFit()
+ .frame(width: 30)
+ .padding(.trailing, 5)
+ Text("About")
+ .font(.system(size: 20, weight: .regular))
+ .foregroundColor(Color("TextPrimary"))
+ }
+ .padding(.bottom, UIScreen.main.bounds.height * 0.07)
+ }
+ HStack{
+ Link(destination: URL(string: "https://docs.netbird.io")!) {
+ Image("menu-faq")
+ .resizable()
+ .scaledToFit()
+ .frame(width: 30)
+ .padding(.trailing, 5)
+ Text("Docs")
+ .font(.system(size: 20, weight: .regular))
+ .foregroundColor(Color("TextPrimary"))
+ }
+ }
+ .buttonStyle(PlainButtonStyle())
+ .padding(.bottom, UIScreen.main.bounds.height * 0.07)
+
+ Button {
+ viewModel.showChangeServerAlert = true
+ viewModel.presentSideDrawer = false
+ } label: {
+ HStack(alignment: .center, content: {
+ Image("menu-change")
+ .resizable()
+ .scaledToFit()
+ .frame(width: 30)
+ .padding(.trailing, 5)
+ Text("Change Server")
+ .font(.system(size: 20, weight: .regular))
+ .foregroundColor(Color("TextPrimary"))
+ .padding(.top, 3)
+ })
+ }
+ }
+ .padding(.leading, UIScreen.main.bounds.width * 0.10)
+ Spacer()
+ HStack {
+ Spacer()
+ Text("Version \(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "unknown")")
+ .font(.system(size: 18, weight: .regular))
+ .foregroundColor(Color("TextPrimary"))
+ Spacer()
+ }
+ .padding(.bottom, UIScreen.main.bounds.height * 0.06)
+ }
+ .padding(.top, 10)
+ .frame(width: UIScreen.main.bounds.width * (isIpad ? 0.4 : 0.7))
+ }
+ }
+}
+
+
+
+struct SideDrawer_Previews: PreviewProvider {
+ private var isShowing = true
+ static var previews: some View {
+ SideMenu(viewModel: ViewModel())
+ }
+}
diff --git a/NetBird/Source/App/Views/Components/SolidButton.swift b/NetBird/Source/App/Views/Components/SolidButton.swift
new file mode 100644
index 0000000..5d3130c
--- /dev/null
+++ b/NetBird/Source/App/Views/Components/SolidButton.swift
@@ -0,0 +1,49 @@
+//
+// SolidButton.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 01.08.23.
+//
+
+import SwiftUI
+
+struct SolidButton: View {
+ var text : String
+ var action: () -> Void
+ var body: some View {
+ Button {
+ action()
+ } label: {
+ Text(text)
+ .font(.headline)
+ .foregroundColor(.white)
+ .padding()
+ .frame(maxWidth: .infinity)
+ .background(
+ RoundedRectangle(cornerRadius: 3)
+ .fill(Color.accentColor)
+ .overlay(
+ RoundedRectangle(cornerRadius: 3)
+ .stroke(Color.orange.darker(), lineWidth: 2)
+ )
+ )
+ }
+ }
+}
+
+extension Color {
+ func darker() -> Color {
+ let components = UIColor(self).cgColor.components!
+ return Color(red: Double(components[0] * 0.9),
+ green: Double(components[1] * 0.9),
+ blue: Double(components[2] * 0.9))
+ }
+}
+
+struct SolidButton_Previews: PreviewProvider {
+ static var previews: some View {
+ SolidButton(text: "save") {
+ print("noop")
+ }
+ }
+}
diff --git a/NetBird/Source/App/Views/MainView.swift b/NetBird/Source/App/Views/MainView.swift
new file mode 100644
index 0000000..9007c51
--- /dev/null
+++ b/NetBird/Source/App/Views/MainView.swift
@@ -0,0 +1,574 @@
+//
+// MainView.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 01.08.23.
+//
+
+import SwiftUI
+import Lottie
+
+struct MainView: View {
+ @EnvironmentObject var viewModel: ViewModel
+ @State private var isSheetshown = true
+ @State private var isSheetExpanded = false
+ @State private var animationKey: UUID = UUID()
+
+ let isIpad = UIDevice.current.userInterfaceIdiom == .pad
+
+ init() {
+ let appearance = UINavigationBarAppearance()
+ appearance.configureWithOpaqueBackground()
+ appearance.backgroundColor = UIColor(named: "BgNavigationBar")
+
+ // Customize the title text color
+ appearance.titleTextAttributes = [.foregroundColor: UIColor.white]
+ appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
+
+ // Set the appearance for when the navigation bar is displayed regularly
+ UINavigationBar.appearance().standardAppearance = appearance
+
+ // Set the appearance for when the navigation bar has a collapsed state
+ UINavigationBar.appearance().compactAppearance = appearance // Optional
+
+ // Set the appearance for when the navigation bar is displayed in a scroll edge context
+ UINavigationBar.appearance().scrollEdgeAppearance = appearance // For iOS 15 and later
+ }
+
+ var body: some View {
+ NavigationView {
+ ZStack {
+ if viewModel.statusDetailsValid {
+ VStack {
+ Color("BgSecondary")
+ .frame(height: UIScreen.main.bounds.height * 3/5)
+ .ignoresSafeArea(.all)
+ Color("BgPrimary")
+ .frame(height: UIScreen.main.bounds.height * 2/5)
+ .ignoresSafeArea(.all)
+ }
+ VStack {
+ Image("bg-bottom")
+ .resizable(resizingMode: .stretch)
+ .aspectRatio(contentMode: .fill)
+ .padding(.top, UIScreen.main.bounds.height * (isIpad ? 0.32 : 0.19))
+ .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.width * 1.33)
+ .edgesIgnoringSafeArea(.bottom)
+ }
+ VStack {
+ Text(viewModel.fqdn)
+ .foregroundColor(Color("TextSecondary"))
+ .font(.system(size: 20, weight: .regular))
+ .padding(.top, UIScreen.main.bounds.height * 0.11)
+ .padding(.bottom, 5)
+ Text(viewModel.ip)
+ .foregroundColor(Color("TextSecondary"))
+ .font(.system(size: 20, weight: .regular))
+ Spacer()
+ }
+ VStack() {
+ HStack {
+ Button {
+ viewModel.presentSideDrawer = true
+ } label: {
+ Image("hamburgerMenu")
+ .resizable()
+ .frame(width: 35, height: 35)
+ .padding(.top, UIScreen.main.bounds.height * 0.03)
+ }
+ Spacer()
+ }
+// Spacer()
+// Button("print logs") {
+// let fileManager = FileManager.default
+// let groupURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.io.netbird.app")
+// let logURL = groupURL?.appendingPathComponent("logfile.log")
+// printLogContents(from: logURL!)
+// }
+ Spacer()
+ Button(action: {
+ if !viewModel.buttonLock {
+ if viewModel.extensionState == .disconnected {
+ viewModel.connect()
+ } else if viewModel.extensionState == .connecting || viewModel.statusDetails.managementStatus == .connecting || viewModel.extensionState == .connected {
+ print("Trying to stop extenison")
+ viewModel.close()
+ }
+ }
+ }) {
+ CustomLottieView(extensionStatus: $viewModel.extensionState, engineStatus: $viewModel.statusDetails.managementStatus, connectPressed: $viewModel.connectPressed, disconnectPressed: $viewModel.disconnectPressed, viewModel: viewModel)
+ .id(animationKey)
+ .frame(width: UIScreen.main.bounds.width * 0.79, height: UIScreen.main.bounds.width * 0.79)
+ .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
+ withAnimation {
+ self.animationKey = UUID()
+ }
+ }
+ }
+ .padding(.top, -UIScreen.main.bounds.height / 27)
+ .padding(.bottom)
+ Text(viewModel.extensionStateText)
+ .foregroundColor(Color("TextSecondary"))
+ .font(.system(size: 24, weight: .regular))
+ Spacer()
+ }
+ .padding()
+ SheetView(isSheetExpanded: $isSheetExpanded, peerInfo: viewModel.statusDetails.peerInfo)
+ SideDrawer(viewModel: viewModel, isShowing: $viewModel.presentSideDrawer)
+ NavigationLink("", destination: ServerView(), isActive: $viewModel.navigateToServerView)
+ .hidden()
+ if viewModel.networkExtensionAdapter.showBrowser && viewModel.networkExtensionAdapter.loginURL != nil && URL(string: viewModel.networkExtensionAdapter.loginURL!) != nil {
+ SafariView(isPresented: $viewModel.networkExtensionAdapter.showBrowser,
+ url: URL(string: viewModel.networkExtensionAdapter.loginURL!)!,
+ didFinish: {
+ print("Finish login")
+ viewModel.networkExtensionAdapter.startVPNConnection()
+ })
+
+ }
+ if viewModel.showChangeServerAlert {
+ Color.black.opacity(0.4)
+ .edgesIgnoringSafeArea(.all)
+ .onTapGesture {
+ viewModel.showChangeServerAlert = false
+ }
+
+ ChangeServerAlert(viewModel: viewModel, isPresented: $viewModel.showChangeServerAlert)
+ .frame(maxWidth: UIScreen.main.bounds.width * 0.9)
+ }
+ if viewModel.showServerChangedInfo {
+ Color.black.opacity(0.4)
+ .edgesIgnoringSafeArea(.all)
+ .onTapGesture {
+ viewModel.showServerChangedInfo = false
+ }
+
+ ChangeServerInfoAlert(viewModel: viewModel, isPresented: $viewModel.showServerChangedInfo)
+ .frame(maxWidth: UIScreen.main.bounds.width * 0.9)
+ }
+ if viewModel.showPreSharedKeyChangedInfo {
+ Color.black.opacity(0.4)
+ .edgesIgnoringSafeArea(.all)
+ .onTapGesture {
+ viewModel.showPreSharedKeyChangedInfo = false
+ }
+
+ ChangePreSharedKeyAlert(viewModel: viewModel, isPresented: $viewModel.showPreSharedKeyChangedInfo)
+ .frame(maxWidth: UIScreen.main.bounds.width * 0.9)
+ }
+ // diabled for now as it is generating to much false positives
+ if viewModel.showAuthenticationRequired && false {
+ Color.black.opacity(0.4)
+ .edgesIgnoringSafeArea(.all)
+ .onTapGesture {
+ viewModel.buttonLock = true
+ viewModel.showAuthenticationRequired = false
+ DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+ viewModel.buttonLock = false
+ }
+ }
+
+ AuthenticationAlert(viewModel: viewModel, isPresented: $viewModel.showAuthenticationRequired)
+ .frame(maxWidth: UIScreen.main.bounds.width * 0.9)
+ }
+ ZStack {
+ VStack {
+ Spacer()
+ if viewModel.showCopiedAlert {
+ HStack {
+ Image("logo-onboarding")
+ .resizable()
+ .frame(width: 20, height: 15)
+ Text("Domain name copied!")
+ .foregroundColor(.white)
+ .font(.headline)
+ }
+ .padding(5)
+ .background(Color.black.opacity(0.5))
+ .cornerRadius(8)
+ .transition(AnyTransition.opacity.combined(with: .move(edge: .top)))
+ .animation(.default, value: viewModel.showCopiedAlert)
+ .zIndex(1)
+ }
+ if viewModel.showCopiedInfoAlert {
+ Text("Double-tap to copy!")
+ .foregroundColor(.white)
+ .font(.headline)
+ .padding(5)
+ .background(Color.black.opacity(0.5))
+ .cornerRadius(8)
+ .transition(AnyTransition.opacity.combined(with: .move(edge: .top)))
+ .animation(.default, value: viewModel.showCopiedInfoAlert)
+ .zIndex(1)
+ }
+ }
+ .padding(.bottom, 40)
+ }
+ } else {
+ Image("netbird-logo-menu")
+ .resizable()
+ .scaledToFit()
+ .frame(width: UIScreen.main.bounds.width * 0.8)
+ }
+ }
+ .navigationBarTitleDisplayMode(.inline)
+ .navigationBarHidden(true)
+ }
+ .navigationViewStyle(StackNavigationViewStyle())
+ }
+}
+
+struct SheetView: View {
+ @EnvironmentObject var viewModel: ViewModel
+
+ @Binding var isSheetExpanded: Bool
+ var peerInfo: [PeerInfo]
+ @GestureState private var translation: CGFloat = 0
+
+ @State private var peerFilter: String = ""
+ @State private var selectionFilter: String = "All"
+ @State private var showDropdown: Bool = false
+
+ @State private var tappedPeer: PeerInfo? = nil
+
+ let isIpad = UIDevice.current.userInterfaceIdiom == .pad
+
+ var filteredPeers: [PeerInfo] {
+ return peerInfo
+ .filter {
+ switch selectionFilter {
+ case "All": return true
+ case "Connected": return $0.connStatus == "Connected"
+ case "Disconnected": return $0.connStatus == "Disconnected"
+ default: return false
+ }
+ }
+ .filter {
+ $0.fqdn.lowercased().contains(peerFilter.lowercased()) ||
+ $0.ip.contains(peerFilter) ||
+ peerFilter.isEmpty
+ }
+ }
+
+
+ var body: some View {
+ ZStack {
+ ZStack {
+ VStack {
+ Button {
+ withAnimation(.linear(duration: 0.2)) {
+ isSheetExpanded.toggle()
+ }
+ } label: {
+ Handlebar().padding(.top, 5)
+ }
+ HStack {
+ Text((viewModel.extensionStateText != "Connected" ? "0" : peerInfo.filter({ info in
+ info.connStatus == "Connected"
+ }).count.description) + " of " + (viewModel.extensionStateText != "Connected" ? "0" : peerInfo.count.description)).font(.system(size: 18, weight: .bold))
+ .foregroundColor(Color("TextSecondary"))
+ Text("Peers connected")
+ .font(.system(size: 18, weight: .regular))
+ .foregroundColor(Color("TextSecondary"))
+ }
+ .padding(.top, UIScreen.main.bounds.height * (isIpad ? 0.02 : 0.005))
+ .padding(.bottom, 15)
+ if viewModel.extensionStateText == "Connected" && peerInfo.count > 0 {
+ VStack {
+ HStack {
+ CustomTextField(placeholder: "search peers", text: $peerFilter, secure: .constant(false))
+ .padding([.top, .bottom], 10)
+ Menu {
+ Button(action: { selectionFilter = "All" }) {
+ Text("All")
+ }
+
+ Button(action: { selectionFilter = "Connected" }) {
+ Text("Connected")
+ }
+ Button(action: { selectionFilter = "Disconnected" }) {
+ Text("Disconnected")
+ }
+
+ } label: {
+ Image("icon-filter")
+ .padding([.leading, .trailing], 4)
+ }
+ }.padding([.leading, .trailing])
+ ZStack {
+ ScrollView {
+ ForEach(filteredPeers) { peer in
+ ZStack {
+ PeerCard(peer: peer)
+ .opacity(tappedPeer == peer ? 0.3 : 1.0)
+ .onTapGesture(count: 2) {
+ tappedPeer = peer
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
+ withAnimation {
+ tappedPeer = nil
+ }
+ }
+
+ print("Copied to clipboard")
+ UIPasteboard.general.string = peer.fqdn
+ viewModel.showCopiedAlert = true
+
+ DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+ withAnimation {
+ viewModel.showCopiedAlert = false
+ }
+ }
+ }
+ .onTapGesture {
+ UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
+ print("show notication")
+ viewModel.showCopiedInfoAlert = true
+ DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+ withAnimation {
+ viewModel.showCopiedInfoAlert = false
+ }
+ }
+ }
+ .padding([.top,.bottom], 2)
+ }
+ }
+ }
+ .frame(height: UIScreen.main.bounds.height * 0.70)
+ .padding(.bottom, 1)
+ }
+ }
+ } else {
+ Group {
+ Image("icon-empty-box")
+ .padding(.top, UIScreen.main.bounds.height * 0.05)
+ Text("It looks like there are no machines that you can connect to...")
+ .font(.system(size: 18, weight: .regular))
+ .foregroundColor(Color("TextPrimary"))
+ .multilineTextAlignment(.center)
+ .padding(.top, UIScreen.main.bounds.height * 0.04)
+ .padding([.leading, .trailing], UIScreen.main.bounds.width * 0.075)
+ Link(destination: URL(string: "https://docs.netbird.io")!) {
+ Text("Learn why")
+ .font(.headline)
+ .foregroundColor(.white)
+ .padding()
+ .frame(maxWidth: .infinity) // Span the whole width
+ .background(
+ RoundedRectangle(cornerRadius: 3)
+ .fill(Color.accentColor)
+ .overlay(
+ RoundedRectangle(cornerRadius: 3)
+ .stroke(Color.orange.darker(), lineWidth: 2)
+ )
+ )
+ .padding(.top, UIScreen.main.bounds.height * 0.04)
+ }
+ }
+ .padding([.leading, .trailing], UIScreen.main.bounds.width * 0.05)
+ }
+ Spacer()
+ }
+ if isSheetExpanded {
+ VStack {
+ HStack {
+ Spacer()
+ Button {
+ withAnimation {
+ isSheetExpanded = false
+ }
+ } label: {
+ Image("close-slider")
+ .padding(25)
+ }
+ }
+ Spacer()
+ }
+ }
+ }
+ .padding(.top, 3)
+ .padding(.bottom, 7)
+ .frame(maxWidth: .infinity, maxHeight: UIScreen.main.bounds.height)
+ .background(Color("BgMenu"))
+ .cornerRadius(35)
+ .shadow(radius: 10)
+ .offset(y: isSheetExpanded ? UIScreen.main.bounds.height * 0.1 : UIScreen.main.bounds.height * 0.90 + translation)
+ .gesture(
+ DragGesture()
+ .updating($translation, body: { value, state, _ in
+ state = value.translation.height
+ })
+ .onEnded({ value in
+ if value.translation.height > UIScreen.main.bounds.height * 0.25 {
+ withAnimation {
+ isSheetExpanded = false
+ }
+ } else {
+ withAnimation {
+ isSheetExpanded = true
+ }
+ }
+ })
+ )
+ .onTapGesture {
+ UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
+ }
+
+ // Add a transparent background to enable interaction with the rest of the screen when collapsed
+ if !isSheetExpanded {
+ Color.clear
+ .ignoresSafeArea(.container)
+ .onTapGesture {
+ withAnimation {
+ isSheetExpanded = true
+ }
+ }
+ }
+ }
+ .frame(maxHeight: .infinity) // Make sure the sheet can take up the entire screen height
+ .ignoresSafeArea(.keyboard) // Ignore the keyboard to prevent conflicts with the sheet layout
+ }
+}
+
+struct Handlebar: View {
+ var body: some View {
+ Rectangle()
+ .fill(Color("HandleBar"))
+ .frame(width: UIScreen.main.bounds.width * 0.3, height: 7)
+ .cornerRadius(7)
+ }
+}
+
+struct ChangeServerAlert: View {
+ @StateObject var viewModel: ViewModel
+ @Binding var isPresented: Bool
+
+ var body: some View {
+ VStack(spacing: 20) {
+ Image("exclamation-circle")
+ .padding(.top, 20)
+ Text("Change server")
+ .font(.title)
+ .foregroundColor(Color("TextAlert"))
+ Text("Changing server will erase the local config and disconnect this device from the current NetBird account.")
+ .foregroundColor(Color("TextAlert"))
+ .multilineTextAlignment(.center)
+ SolidButton(text: "Confirm") {
+ viewModel.close()
+ viewModel.clearDetails()
+ isPresented.toggle()
+ viewModel.navigateToServerView = true
+ }
+ .padding(.top, 20)
+
+ Button {
+ isPresented.toggle()
+ } label: {
+ Text("Cancel")
+ .font(.headline)
+ .foregroundColor(Color.accentColor)
+ .padding()
+ .frame(maxWidth: .infinity) // Span the whole width
+ .background(
+ RoundedRectangle(cornerRadius: 3)
+ .fill(Color(red: 0, green: 0, blue: 0, opacity: 0))
+ .overlay(
+ RoundedRectangle(cornerRadius: 3)
+ .stroke(Color.accentColor, lineWidth: 1)
+ )
+ )
+ }
+ }
+ .padding()
+ .background(Color("BgSideDrawer"))
+ .cornerRadius(15)
+ .shadow(radius: 10)
+ }
+}
+
+struct ChangeServerInfoAlert: View {
+ @StateObject var viewModel: ViewModel
+ @Binding var isPresented: Bool
+
+ var body: some View {
+ VStack(spacing: 20) {
+ Image("check-circle")
+ .padding(.top, 20)
+ Text("Server was changed")
+ .font(.title)
+ .foregroundColor(Color("TextAlert"))
+ Text("Click on the connect button to continue.")
+ .multilineTextAlignment(.center)
+ .foregroundColor(Color("TextAlert"))
+ SolidButton(text: "Ok") {
+ viewModel.showServerChangedInfo = false
+ }
+ .padding(.top, 20)
+ }
+ .padding()
+ .background(Color("BgSideDrawer"))
+ .cornerRadius(15)
+ .shadow(radius: 10)
+ }
+}
+
+struct ChangePreSharedKeyAlert: View {
+ @StateObject var viewModel: ViewModel
+ @Binding var isPresented: Bool
+
+ var body: some View {
+ VStack(spacing: 20) {
+ Image("check-circle")
+ .padding(.top, 20)
+ Text("Preshared key was set")
+ .font(.title)
+ .foregroundColor(Color("TextAlert"))
+ Text("Click on the connect button to continue.")
+ .multilineTextAlignment(.center)
+ .foregroundColor(Color("TextAlert"))
+ SolidButton(text: "Ok") {
+ viewModel.showPreSharedKeyChangedInfo = false
+ }
+ .padding(.top, 20)
+ }
+ .padding()
+ .background(Color("BgSideDrawer"))
+ .cornerRadius(15)
+ .shadow(radius: 10)
+ }
+}
+
+struct AuthenticationAlert: View {
+ @StateObject var viewModel: ViewModel
+ @Binding var isPresented: Bool
+
+ var body: some View {
+ VStack(spacing: 20) {
+ Image("exclamation-circle")
+ .padding(.top, 20)
+ Text("Authentication required")
+ .foregroundColor(Color("TextAlert"))
+ .font(.title)
+ Text("The server requires a new authentication.")
+ .foregroundColor(Color("TextAlert"))
+ .multilineTextAlignment(.center)
+ SolidButton(text: "Ok") {
+ viewModel.buttonLock = true
+ viewModel.showAuthenticationRequired = false
+ DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+ viewModel.buttonLock = false
+ }
+ }
+ .padding(.top, 20)
+ }
+ .padding()
+ .background(Color("BgSideDrawer"))
+ .cornerRadius(15)
+ .shadow(radius: 10)
+ }
+}
+
+struct MainView_Previews: PreviewProvider {
+ static var previews: some View {
+ MainView()
+ }
+}
diff --git a/NetBird/Source/App/Views/ServerView.swift b/NetBird/Source/App/Views/ServerView.swift
new file mode 100644
index 0000000..cb1f9f9
--- /dev/null
+++ b/NetBird/Source/App/Views/ServerView.swift
@@ -0,0 +1,184 @@
+//
+// ServerView.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 12.10.23.
+//
+
+import SwiftUI
+
+struct ServerView: View {
+
+ @EnvironmentObject var viewModel: ViewModel
+
+ @State private var showSetupKeyField = false
+ @State private var isVerifyingServer = false
+ @State private var isVerifyingKey = false
+
+ @Environment(\.presentationMode) var presentationMode: Binding
+
+ var body: some View {
+ ZStack {
+ Color("BgPage")
+ .edgesIgnoringSafeArea(.bottom)
+ VStack (alignment: .leading){
+ Text("Server")
+ .font(.system(size: 18, weight: .bold))
+ .foregroundColor(Color("TextPrimary"))
+ .padding(.top, UIScreen.main.bounds.height * 0.04)
+ CustomTextField(placeholder: "https://example-api.domain.com:443", text: $viewModel.server, secure: .constant(false))
+ .padding(.top, 3)
+ if viewModel.showInvalidServerAlert {
+ Text("Invalid server address").foregroundColor(.red)
+ }
+ if showSetupKeyField && !isVerifyingServer {
+ Text("Setup key")
+ .font(.system(size: 18, weight: .bold))
+ .foregroundColor(Color("TextPrimary"))
+ CustomTextField(placeholder: "Key", text: $viewModel.setupKey, secure: .constant(false))
+ .padding(.top, 3)
+ if viewModel.showInvalidSetupKeyHint {
+ Text("Invalid setup key").foregroundColor(.red)
+ }
+ }
+ SolidButton(text: isVerifyingServer || isVerifyingKey ? "Verifying..." : "Change") {
+ if viewModel.showInvalidServerAlert || viewModel.server.isEmpty || isVerifyingServer || isVerifyingKey {
+ return
+ }
+ if viewModel.setupKey == "" {
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
+ isVerifyingServer = true
+ }
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
+ let sso = viewModel.updateManagementURL(url: viewModel.server)
+ switch sso {
+ case .none:
+ viewModel.showInvalidServerAlert = true
+ case .some(true):
+ viewModel.showServerChangedInfo = true
+ DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
+ self.presentationMode.wrappedValue.dismiss()
+ viewModel.server = ""
+ DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
+ viewModel.showServerChangedInfo = false
+ }
+ }
+ case .some(false):
+ showSetupKeyField = true
+ }
+ DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+ isVerifyingServer = false
+ }
+ }
+ } else {
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
+ isVerifyingKey = true
+ }
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
+ do {
+ try viewModel.setSetupKey(key: viewModel.setupKey)
+ self.presentationMode.wrappedValue.dismiss()
+ viewModel.showServerChangedInfo = true
+ DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
+ viewModel.showServerChangedInfo = false
+ }
+ viewModel.setupKey = ""
+ isVerifyingKey = false
+ } catch {
+ viewModel.showInvalidSetupKeyAlert = true
+ isVerifyingKey = false
+ }
+ }
+ }
+ print("use custom server")
+ }
+ .padding(.top, 5)
+ Button {
+ if !isVerifyingKey && !isVerifyingServer {
+ let sso = viewModel.updateManagementURL(url: "https://api.netbird.io")
+ print("use netbird server")
+ if sso ?? false {
+ self.presentationMode.wrappedValue.dismiss()
+ viewModel.showServerChangedInfo = true
+ DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
+ viewModel.showServerChangedInfo = false
+ }
+ } else {
+ showSetupKeyField = true
+ }
+ }
+ } label: {
+ Text("Use NetBird server")
+ .font(.headline)
+ .foregroundColor(Color.accentColor)
+ .padding()
+ .frame(maxWidth: .infinity)
+ .background(
+ RoundedRectangle(cornerRadius: 3)
+ .fill(Color(red: 0, green: 0, blue: 0, opacity: 0))
+ .overlay(
+ RoundedRectangle(cornerRadius: 3)
+ .stroke(Color.accentColor, lineWidth: 1)
+ )
+ )
+ }
+ Spacer()
+ }
+ .padding([.leading, .trailing], UIScreen.main.bounds.width * 0.10)
+ if viewModel.showInvalidSetupKeyAlert {
+ Color.black.opacity(0.4)
+ .edgesIgnoringSafeArea(.all)
+ .onTapGesture {
+ viewModel.buttonLock = true
+ viewModel.showInvalidSetupKeyAlert = false
+ DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+ viewModel.buttonLock = false
+ }
+ }
+
+ WrongSetupKeyAlert(viewModel: viewModel, isPresented: $viewModel.showInvalidSetupKeyAlert)
+ .frame(maxWidth: UIScreen.main.bounds.width * 0.9)
+ }
+ }
+ .navigationViewStyle(StackNavigationViewStyle())
+ .navigationBarTitleDisplayMode(.inline)
+ .navigationBarBackButtonHidden(true)
+ .navigationBarItems(leading: CustomBackButton(text: "Change Server", action: {
+ presentationMode.wrappedValue.dismiss()
+ }))
+ .onTapGesture {
+ UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
+ }
+ }
+
+}
+
+struct WrongSetupKeyAlert: View {
+ @StateObject var viewModel: ViewModel
+ @Binding var isPresented: Bool
+
+ var body: some View {
+ VStack(spacing: 20) {
+ Image("exclamation-circle")
+ .padding(.top, 20)
+ Text("Setup key invalid")
+ .font(.title)
+ .foregroundColor(Color("TextAlert"))
+ Text("The provided setup could not be used to login. Check if the key is correct.")
+ .foregroundColor(Color("TextAlert"))
+ .multilineTextAlignment(.center)
+ SolidButton(text: "Confirm") {
+ isPresented.toggle()
+ }
+ .padding(.top, 20)
+ }
+ .padding()
+ .background(Color("BgSideDrawer"))
+ .cornerRadius(15)
+ .shadow(radius: 10)
+ }
+}
+
+#Preview {
+ ServerView()
+}
diff --git a/NetBird/Source/Framework/Ios.framework/Headers b/NetBird/Source/Framework/Ios.framework/Headers
new file mode 120000
index 0000000..a177d2a
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Headers
@@ -0,0 +1 @@
+Versions/Current/Headers
\ No newline at end of file
diff --git a/NetBird/Source/Framework/Ios.framework/Ios b/NetBird/Source/Framework/Ios.framework/Ios
new file mode 120000
index 0000000..aea1f54
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Ios
@@ -0,0 +1 @@
+Versions/Current/Ios
\ No newline at end of file
diff --git a/NetBird/Source/Framework/Ios.framework/Modules b/NetBird/Source/Framework/Ios.framework/Modules
new file mode 120000
index 0000000..5736f31
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Modules
@@ -0,0 +1 @@
+Versions/Current/Modules
\ No newline at end of file
diff --git a/NetBird/Source/Framework/Ios.framework/Resources b/NetBird/Source/Framework/Ios.framework/Resources
new file mode 120000
index 0000000..953ee36
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Resources
@@ -0,0 +1 @@
+Versions/Current/Resources
\ No newline at end of file
diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.h b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.h
new file mode 100644
index 0000000..57a5e65
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.h
@@ -0,0 +1,13 @@
+
+// Objective-C API for talking to the following Go packages
+//
+// github.com/netbirdio/netbird/client/ios
+//
+// File is generated by gomobile bind. Do not edit.
+#ifndef __Ios_FRAMEWORK_H__
+#define __Ios_FRAMEWORK_H__
+
+#include "Ios.objc.h"
+#include "Universe.objc.h"
+
+#endif
diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.objc.h b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.objc.h
new file mode 100644
index 0000000..85e79a9
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.objc.h
@@ -0,0 +1,43 @@
+// Objective-C API for talking to github.com/netbirdio/netbird/client/ios Go package.
+// gobind -lang=objc github.com/netbirdio/netbird/client/ios
+//
+// File is generated by gobind. Do not edit.
+
+#ifndef __Ios_H__
+#define __Ios_H__
+
+@import Foundation;
+#include "ref.h"
+#include "Universe.objc.h"
+
+
+@class IosClient;
+
+/**
+ * Client struct manage the life circle of background service
+ */
+@interface IosClient : NSObject {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+/**
+ * NewClient instantiate a new Client
+ */
+- (nullable instancetype)init:(NSString* _Nullable)cfgFile deviceName:(NSString* _Nullable)deviceName;
+/**
+ * Run start the internal client. It is a blocker function
+ */
+- (BOOL)run:(NSError* _Nullable* _Nullable)error;
+/**
+ * Stop the internal client and free the resources
+ */
+- (void)stop;
+@end
+
+/**
+ * NewClient instantiate a new Client
+ */
+FOUNDATION_EXPORT IosClient* _Nullable IosNewClient(NSString* _Nullable cfgFile, NSString* _Nullable deviceName);
+
+#endif
diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Universe.objc.h b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Universe.objc.h
new file mode 100644
index 0000000..019e750
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Universe.objc.h
@@ -0,0 +1,29 @@
+// Objective-C API for talking to Go package.
+// gobind -lang=objc
+//
+// File is generated by gobind. Do not edit.
+
+#ifndef __Universe_H__
+#define __Universe_H__
+
+@import Foundation;
+#include "ref.h"
+
+@protocol Universeerror;
+@class Universeerror;
+
+@protocol Universeerror
+- (NSString* _Nonnull)error;
+@end
+
+@class Universeerror;
+
+@interface Universeerror : NSError {
+}
+@property(strong, readonly) _Nonnull id _ref;
+
+- (nonnull instancetype)initWithRef:(_Nonnull id)ref;
+- (NSString* _Nonnull)error;
+@end
+
+#endif
diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/ref.h b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/ref.h
new file mode 100644
index 0000000..b8036a4
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/ref.h
@@ -0,0 +1,35 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#ifndef __GO_REF_HDR__
+#define __GO_REF_HDR__
+
+#include
+
+// GoSeqRef is an object tagged with an integer for passing back and
+// forth across the language boundary. A GoSeqRef may represent either
+// an instance of a Go object, or an Objective-C object passed to Go.
+// The explicit allocation of a GoSeqRef is used to pin a Go object
+// when it is passed to Objective-C. The Go seq package maintains a
+// reference to the Go object in a map keyed by the refnum along with
+// a reference count. When the reference count reaches zero, the Go
+// seq package will clear the corresponding entry in the map.
+@interface GoSeqRef : NSObject {
+}
+@property(readonly) int32_t refnum;
+@property(strong) id obj; // NULL when representing a Go object.
+
+// new GoSeqRef object to proxy a Go object. The refnum must be
+// provided from Go side.
+- (instancetype)initWithRefnum:(int32_t)refnum obj:(id)obj;
+
+- (int32_t)incNum;
+
+@end
+
+@protocol goSeqRefInterface
+-(GoSeqRef*) _ref;
+@end
+
+#endif
diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Ios b/NetBird/Source/Framework/Ios.framework/Versions/A/Ios
new file mode 100644
index 0000000..516cc10
Binary files /dev/null and b/NetBird/Source/Framework/Ios.framework/Versions/A/Ios differ
diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Modules/module.modulemap b/NetBird/Source/Framework/Ios.framework/Versions/A/Modules/module.modulemap
new file mode 100644
index 0000000..71b01c4
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Modules/module.modulemap
@@ -0,0 +1,8 @@
+framework module "Ios" {
+ header "ref.h"
+ header "Ios.objc.h"
+ header "Universe.objc.h"
+ header "Ios.h"
+
+ export *
+}
\ No newline at end of file
diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Resources/Info.plist b/NetBird/Source/Framework/Ios.framework/Versions/A/Resources/Info.plist
new file mode 100644
index 0000000..0d1a4b8
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Resources/Info.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/NetBird/Source/Framework/Ios.framework/Versions/Current b/NetBird/Source/Framework/Ios.framework/Versions/Current
new file mode 120000
index 0000000..8c7e5a6
--- /dev/null
+++ b/NetBird/Source/Framework/Ios.framework/Versions/Current
@@ -0,0 +1 @@
+A
\ No newline at end of file
diff --git a/NetBird/Source/Framework/bridge.h b/NetBird/Source/Framework/bridge.h
new file mode 100644
index 0000000..3ad36c6
--- /dev/null
+++ b/NetBird/Source/Framework/bridge.h
@@ -0,0 +1,9 @@
+//
+// bridge.m
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 02.08.23.
+//
+
+#import
+
diff --git a/NetBird/Source/Framework/ios-bridge.m b/NetBird/Source/Framework/ios-bridge.m
new file mode 100644
index 0000000..25de5a0
--- /dev/null
+++ b/NetBird/Source/Framework/ios-bridge.m
@@ -0,0 +1,8 @@
+//
+// ios-bridge.m
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 02.08.23.
+//
+
+#import
diff --git a/NetBird/Source/animations/button-connected.json b/NetBird/Source/animations/button-connected.json
new file mode 100644
index 0000000..698e6e1
--- /dev/null
+++ b/NetBird/Source/animations/button-connected.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":160.000006516934,"w":257,"h":256,"nm":"button activate","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":0,"s":[0]},{"t":139.000005661586,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":10,"s":[0]},{"t":158.000006435472,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":159.000006476203,"s":[720]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/NetBird/Source/animations/button-connecting-loop.json b/NetBird/Source/animations/button-connecting-loop.json
new file mode 100644
index 0000000..beb9ab0
--- /dev/null
+++ b/NetBird/Source/animations/button-connecting-loop.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":42.0000017106951,"w":257,"h":256,"nm":"connecting loop","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705944061,0.51372551918,0.1882353127,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":0,"s":[0.952941236309,0.36862745098,0.196078446332,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705942191,0.513725490196,0.188235309077,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-1,"s":[0]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[0]},{"t":43.0000017514259,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-1,"s":[100,100,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[100,100,100]},{"t":43.0000017514259,"s":[78,78,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/NetBird/Source/animations/button-disconnecting.json b/NetBird/Source/animations/button-disconnecting.json
new file mode 100644
index 0000000..051d8cd
--- /dev/null
+++ b/NetBird/Source/animations/button-disconnecting.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":256,"h":256,"nm":"button off","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.033,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":90.0000036657751,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":90.0000036657751,"s":[0.701960802078,0.701960802078,0.701960802078,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":90.0000036657751,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":-1,"s":[0]},{"t":69.0000028104276,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":5,"s":[0]},{"t":70.0000028511585,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-1,"s":[0]},{"t":69.0000028104276,"s":[272.571]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":-2.00000008146167,"op":70.0000028511585,"st":-20.0000008146167,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":88.0000035843135,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":75.0000030548126,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0}],"markers":[{"tm":45.0000018328876,"cm":"1","dr":0}]}
\ No newline at end of file
diff --git a/NetBird/Source/animations/button-full.json b/NetBird/Source/animations/button-full.json
new file mode 100644
index 0000000..07c6611
--- /dev/null
+++ b/NetBird/Source/animations/button-full.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":399.000016251603,"w":257,"h":256,"nm":"NetBird button","ddd":0,"assets":[{"id":"comp_0","nm":"button start connecting","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":45.0000018328876,"s":[0.964705944061,0.51372551918,0.1882353127,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":45.0000018328876,"s":[0.952941236309,0.36862745098,0.196078446332,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":45.0000018328876,"s":[0.964705942191,0.513725490196,0.188235309077,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":87,"s":[0]},{"t":88.0000035843135,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":44,"s":[100,100,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":84,"s":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":87,"s":[100,100,100]},{"t":88.0000035843135,"s":[78,78,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0}]},{"id":"comp_1","nm":"connecting loop","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705944061,0.51372551918,0.1882353127,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":0,"s":[0.952941236309,0.36862745098,0.196078446332,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705942191,0.513725490196,0.188235309077,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-1,"s":[0]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[0]},{"t":43.0000017514259,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-1,"s":[100,100,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[100,100,100]},{"t":43.0000017514259,"s":[78,78,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0}]},{"id":"comp_2","nm":"connecting to active","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705944061,0.51372551918,0.1882353127,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":0,"s":[0.952941236309,0.36862745098,0.196078446332,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705942191,0.513725490196,0.188235309077,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":16.0000006516934,"s":[0.952941179276,0.368627458811,0.196078434587,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-2,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":12.00000048877,"s":[0.952941179276,0.368627458811,0.196078434587,1]}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0}]},{"id":"comp_3","nm":"button activate","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":0,"s":[0]},{"t":139.000005661586,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":10,"s":[0]},{"t":158.000006435472,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":159.000006476203,"s":[720]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.95294123888,0.368627458811,0.196078449488,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0}]},{"id":"comp_4","nm":"button off","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.033,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":90.0000036657751,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":90.0000036657751,"s":[0.701960802078,0.701960802078,0.701960802078,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":90.0000036657751,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":-1,"s":[0]},{"t":69.0000028104276,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":5,"s":[0]},{"t":70.0000028511585,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-1,"s":[0]},{"t":69.0000028104276,"s":[272.571]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":-2.00000008146167,"op":70.0000028511585,"st":-20.0000008146167,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":88.0000035843135,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":75.0000030548126,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"button start connecting","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"connecting loop","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":78.0000031770051,"op":120.0000048877,"st":78.0000031770051,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"connecting to active","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":120.0000048877,"op":150.000006109625,"st":120.0000048877,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"button activate","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":150.000006109625,"op":310.000012626559,"st":150.000006109625,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"button off","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":256,"h":256,"ip":310.000012626559,"op":400.000016292334,"st":310.000012626559,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/NetBird/Source/animations/button-full2-dark.json b/NetBird/Source/animations/button-full2-dark.json
new file mode 100644
index 0000000..97358a3
--- /dev/null
+++ b/NetBird/Source/animations/button-full2-dark.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":340.000013848484,"w":257,"h":256,"nm":"NetBird button","ddd":0,"assets":[{"id":"comp_0","nm":"button start connecting","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094,0.102,0.114,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.106,0.098,0.122,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[0],"e":[100]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":87,"s":[0],"e":[100]},{"t":88.0000035843135}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":44,"s":[100,100,100],"e":[78,78,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[78,78,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":84,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":87,"s":[100,100,100],"e":[78,78,100]},{"t":88.0000035843135}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0}]},{"id":"comp_1","nm":"connecting loop","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094,0.102,0.114,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.106,0.098,0.122,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-1,"s":[0],"e":[100]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[0],"e":[100]},{"t":43.0000017514259}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-1,"s":[100,100,100],"e":[78,78,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[78,78,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[100,100,100],"e":[78,78,100]},{"t":43.0000017514259}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0}]},{"id":"comp_2","nm":"connecting to active","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094,0.102,0.114,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.106,0.098,0.122,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"t":16.0000006516934}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-2,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"t":12.00000048877}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0}]},{"id":"comp_3","nm":"button activate","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094,0.102,0.114,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.106,0.098,0.122,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":0,"s":[0],"e":[100]},{"t":139.000005661586}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":10,"s":[0],"e":[100]},{"t":158.000006435472}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[720]},{"t":159.000006476203}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.95294123888,0.368627458811,0.196078449488,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0}]},{"id":"comp_4","nm":"connecting to active 2","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.964705944061,0.51372551918,0.1882353127,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.952941236309,0.36862745098,0.196078446332,1],"e":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.964705942191,0.513725490196,0.188235309077,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094,0.102,0.114,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.106,0.098,0.122,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.952941179276,0.368627458811,0.196078434587,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":10.0000004073083}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-2,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.952941179276,0.368627458811,0.196078434587,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":10.0000004073083}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"button start connecting","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"connecting loop","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":78.0000031770051,"op":120.0000048877,"st":78.0000031770051,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"connecting to active","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":120.0000048877,"op":150.000006109625,"st":120.0000048877,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"button activate","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":150.000006109625,"op":310.000012626559,"st":150.000006109625,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"connecting to active 2","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":310.000012626559,"op":340.000013848484,"st":310.000012626559,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/NetBird/Source/animations/button-full2.json b/NetBird/Source/animations/button-full2.json
new file mode 100644
index 0000000..896eaae
--- /dev/null
+++ b/NetBird/Source/animations/button-full2.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":340.000013848484,"w":257,"h":256,"nm":"NetBird button","ddd":0,"assets":[{"id":"comp_0","nm":"button start connecting","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[0],"e":[100]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":87,"s":[0],"e":[100]},{"t":88.0000035843135}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":44,"s":[100,100,100],"e":[78,78,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[78,78,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":84,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":87,"s":[100,100,100],"e":[78,78,100]},{"t":88.0000035843135}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0}]},{"id":"comp_1","nm":"connecting loop","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-1,"s":[0],"e":[100]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[0],"e":[100]},{"t":43.0000017514259}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-1,"s":[100,100,100],"e":[78,78,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[78,78,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[100,100,100],"e":[78,78,100]},{"t":43.0000017514259}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0}]},{"id":"comp_2","nm":"connecting to active","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"t":16.0000006516934}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-2,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"t":12.00000048877}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0}]},{"id":"comp_3","nm":"button activate","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":0,"s":[0],"e":[100]},{"t":139.000005661586}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":10,"s":[0],"e":[100]},{"t":158.000006435472}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[720]},{"t":159.000006476203}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.95294123888,0.368627458811,0.196078449488,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0}]},{"id":"comp_4","nm":"connecting to active 2","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.964705944061,0.51372551918,0.1882353127,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.952941236309,0.36862745098,0.196078446332,1],"e":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.964705942191,0.513725490196,0.188235309077,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.952941179276,0.368627458811,0.196078434587,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":10.0000004073083}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-2,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.952941179276,0.368627458811,0.196078434587,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":10.0000004073083}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"button start connecting","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"connecting loop","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":78.0000031770051,"op":120.0000048877,"st":78.0000031770051,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"connecting to active","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":120.0000048877,"op":150.000006109625,"st":120.0000048877,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"button activate","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":150.000006109625,"op":310.000012626559,"st":150.000006109625,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"connecting to active 2","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":310.000012626559,"op":340.000013848484,"st":310.000012626559,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/NetBird/Source/animations/button-start-connecting.json b/NetBird/Source/animations/button-start-connecting.json
new file mode 100644
index 0000000..c633564
--- /dev/null
+++ b/NetBird/Source/animations/button-start-connecting.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":78.0000031770051,"w":257,"h":256,"nm":"button start connecting","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":45.0000018328876,"s":[0.964705944061,0.51372551918,0.1882353127,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":45.0000018328876,"s":[0.952941236309,0.36862745098,0.196078446332,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":45.0000018328876,"s":[0.964705942191,0.513725490196,0.188235309077,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":87,"s":[0]},{"t":88.0000035843135,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":44,"s":[100,100,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":84,"s":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":87,"s":[100,100,100]},{"t":88.0000035843135,"s":[78,78,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/NetBird/Source/animations/loading.json b/NetBird/Source/animations/loading.json
new file mode 100644
index 0000000..909ea4f
--- /dev/null
+++ b/NetBird/Source/animations/loading.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":120.0000048877,"w":24,"h":24,"nm":"loading","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[12,12,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[75.141,75.141],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.533],"y":[1]},"o":{"x":[0.387],"y":[0]},"t":25,"s":[0],"e":[100]},{"t":118.000004806239}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0],"e":[100]},{"t":104.000004236007}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[720]},{"t":119.000004846969}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":120.0000048877,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/NetBird/Source/animations/logo_NetBird.json b/NetBird/Source/animations/logo_NetBird.json
new file mode 100644
index 0000000..ec54faf
--- /dev/null
+++ b/NetBird/Source/animations/logo_NetBird.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":160.000006516934,"w":200,"h":50,"nm":"netbird-logo","ddd":0,"assets":[{"id":"comp_0","nm":"logo","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[23.581,31.102,0],"ix":2,"l":2},"a":{"a":0,"k":[9.438,13.772,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0.003,0.295],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.02,0.255]],"v":[[9.165,2.353],[3.187,13.402],[2.825,13.522],[9.188,2.393]],"c":true}],"e":[{"i":[[4.227,2.117],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.841,-7.202]],"v":[[-2.252,-8.751],[-7.126,2.777],[2.825,13.522],[9.188,2.393]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[4.227,2.117],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.841,-7.202]],"v":[[-2.252,-8.751],[-7.126,2.777],[2.825,13.522],[9.188,2.393]],"c":true}],"e":[{"i":[[5.072,2.481],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-1.005,-8.694]],"v":[[-1.085,-13.522],[-9.188,0.652],[2.825,13.522],[9.188,2.393]],"c":true}]},{"t":26.0000010590017}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.438,13.772],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10.0000004073083,"op":1370.00005580124,"st":10.0000004073083,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16.387,26.43,0],"ix":2,"l":2},"a":{"a":0,"k":[16.636,18.444,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0],[-0.398,-0.141]],"o":[[0,0],[0,0],[0,0]],"v":[[10.02,18.194],[10.364,18.028],[16.387,7.086]],"c":true}],"e":[{"i":[[0,0],[0,0],[-2.906,-25.28]],"o":[[0,0],[0,0],[0,0]],"v":[[10.02,18.194],[-16.387,-10.097],[16.387,7.086]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[{"i":[[0,0],[0,0],[-2.906,-25.28]],"o":[[0,0],[0,0],[0,0]],"v":[[10.02,18.194],[-16.387,-10.097],[16.387,7.086]],"c":true}],"e":[{"i":[[0,0],[0,0],[-4.773,-23.141]],"o":[[0,0],[0,0],[0,0]],"v":[[-1.856,5.319],[-15.137,-16.472],[16.387,7.086]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[0,0],[-4.773,-23.141]],"o":[[0,0],[0,0],[0,0]],"v":[[-1.856,5.319],[-15.137,-16.472],[16.387,7.086]],"c":true}],"e":[{"i":[[0,0],[0,0],[-2.906,-25.28]],"o":[[0,0],[0,0],[0,0]],"v":[[-1.731,5.694],[-16.387,-10.097],[16.387,7.086]],"c":true}]},{"t":37.0000015070409}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.636,18.444],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10.0000004073083,"op":1370.00005580124,"st":10.0000004073083,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.27,27.921,0],"ix":2,"l":2},"a":{"a":0,"k":[19.486,16.953,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[{"i":[[0,0],[1.033,-1.612],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-5.494,0.513],[0,0],[-0.032,0.067],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.672,-0.954],[-11.927,4.365],[-12.391,5.178],[-12.445,5.29],[-12.451,5.281],[-12.861,6.453],[6.511,6.453],[10.486,-0.954]],"c":true}],"e":[{"i":[[0,0],[1.033,-1.612],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-5.494,0.513],[0,0],[-0.032,0.067],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[8.62,-22.079],[-0.635,-16.76],[-5.725,-6.822],[-5.778,-6.71],[-5.784,-6.719],[-20.593,19.513],[-1.221,19.513],[21.777,-22.079]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[0,0],[1.033,-1.612],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-5.494,0.513],[0,0],[-0.032,0.067],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[8.62,-22.079],[-0.635,-16.76],[-5.725,-6.822],[-5.778,-6.71],[-5.784,-6.719],[-20.593,19.513],[-1.221,19.513],[21.777,-22.079]],"c":true}],"e":[{"i":[[0,0],[1.033,-1.612],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-5.494,0.513],[0,0],[-0.032,0.067],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.079,-16.704],[-3.176,-11.385],[-3.641,-10.572],[-3.695,-10.46],[-3.701,-10.469],[-19.236,16.704],[0.137,16.704],[19.236,-16.704]],"c":true}]},{"t":22.0000008960784}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.486,16.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1360.00005539394,"st":0,"bm":0}]},{"id":"comp_1","nm":"tipo","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[126.163,31.338,0],"ix":2,"l":2},"a":{"a":0,"k":[74.084,16.935,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,1.791],[0.716,1.33],[1.23,0.693],[1.459,0],[1.202,-0.693],[0.715,-1.329],[0,-1.792],[-0.716,-1.358],[-1.202,-0.722],[-1.459,0],[-1.201,0.693],[-0.715,1.329]],"o":[[0,-1.791],[-0.715,-1.329],[-1.201,-0.723],[-1.459,0],[-1.202,0.694],[-0.716,1.329],[0,1.82],[0.715,1.329],[1.202,0.693],[1.459,0],[1.23,-0.722],[0.716,-1.358]],"v":[[7.982,3.922],[6.909,-0.759],[3.991,-3.792],[0,-4.876],[-3.991,-3.836],[-6.866,-0.802],[-7.939,3.879],[-6.866,8.646],[-3.991,11.723],[0,12.763],[3.991,11.723],[6.909,8.646]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,2.398],[-0.973,1.82],[-1.688,1.011],[-2.118,0],[-1.573,-0.867],[-0.829,-1.387],[0,0],[0,0],[0,0],[0,0],[0,0],[1.516,-0.925],[2.031,0],[1.717,1.04],[0.973,1.878]],"o":[[0,-2.427],[0.973,-1.849],[1.717,-1.012],[1.831,0],[1.574,0.838],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.772,1.416],[-1.516,0.895],[-2.089,0],[-1.688,-1.04],[-0.973,-1.878]],"v":[[-11.93,3.879],[-10.471,-2.492],[-6.48,-6.782],[-0.729,-8.299],[4.377,-6.999],[7.982,-3.662],[7.982,-16.23],[11.93,-16.23],[11.93,15.84],[7.982,15.84],[7.982,11.376],[4.549,14.887],[-0.772,16.23],[-6.48,14.67],[-10.471,10.293]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.987,17.39],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.259,0.751],[-1.831,0],[0,0],[0,0],[0,-4.796],[0,0],[0,0],[0,0],[0,0]],"o":[[0.686,-1.358],[1.287,-0.751],[0,0],[0,0],[-4.378,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.845,-7.801],[1.073,-10.965],[5.751,-12.092],[5.751,-8.018],[4.721,-8.018],[-1.845,-0.824],[-1.845,12.092],[-5.751,12.092],[-5.751,-11.658],[-1.845,-11.658]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.258,21.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.932,16.49],[-1.975,16.49],[-1.975,-7.259],[1.932,-7.259]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[1.932,-7.259]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.716,0],[0.515,0.52],[0,0.751],[-0.515,0.52],[-0.743,0],[-0.487,-0.52],[0,-0.751],[0.515,-0.52]],"o":[[-0.743,0],[-0.515,-0.52],[0,-0.751],[0.515,-0.52],[0.716,0],[0.515,0.52],[0,0.751],[-0.487,0.52]],"v":[[0.042,-11.116],[-1.846,-11.896],[-2.618,-13.803],[-1.846,-15.71],[0.042,-16.49],[1.846,-15.71],[2.618,-13.803],[1.846,-11.896]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[100.92,16.74],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":5,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,1.82],[0.715,1.328],[1.23,0.693],[1.459,0],[1.23,-0.722],[0.744,-1.358],[0,-1.762],[-0.715,-1.358],[-1.202,-0.722],[-1.431,0],[-1.202,0.694],[-0.715,1.329]],"o":[[0,-1.791],[-0.715,-1.33],[-1.202,-0.694],[-1.431,0],[-1.202,0.694],[-0.715,1.329],[0,1.792],[0.744,1.329],[1.23,0.694],[1.459,0],[1.23,-0.722],[0.715,-1.358]],"v":[[7.939,3.879],[6.866,-0.801],[3.948,-3.835],[-0.043,-4.875],[-4.034,-3.792],[-6.953,-0.715],[-8.025,3.922],[-6.953,8.646],[-4.034,11.723],[-0.043,12.763],[3.948,11.723],[6.866,8.646]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-1.545,0.896],[-1.974,0],[-1.688,-1.011],[-0.973,-1.849],[0,-2.427],[0.973,-1.878],[1.717,-1.04],[2.089,0],[1.545,0.896],[0.772,1.387],[0,0],[0,0],[0,0],[0,0]],"o":[[0.801,-1.416],[1.545,-0.895],[2.117,0],[1.688,1.011],[0.973,1.82],[0,2.398],[-0.973,1.878],[-1.688,1.04],[-2.031,0],[-1.517,-0.896],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.025,-3.488],[-4.506,-6.956],[0.772,-8.299],[6.48,-6.782],[10.471,-2.492],[11.93,3.879],[10.471,10.293],[6.437,14.67],[0.772,16.23],[-4.592,14.887],[-8.025,11.463],[-8.025,15.84],[-11.931,15.84],[-11.931,-16.23],[-8.025,-16.23]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[81.875,17.39],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.486,-0.491],[-1.201,0],[0,0],[0,0],[0,0],[1.087,1.011],[0,2.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,1.156],[0.487,0.463],[0,0],[0,0],[0,0],[-2.175,0],[-1.087,-1.011],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.408,-5.634],[0.408,8.364],[1.137,10.834],[3.669,11.528],[6.544,11.528],[6.544,14.865],[3.025,14.865],[-1.867,13.348],[-3.499,8.364],[-3.499,-5.634],[-6.544,-5.634],[-6.544,-8.884],[-3.499,-8.884],[-3.499,-14.865],[0.408,-14.865],[0.408,-8.884],[6.544,-8.884],[6.544,-5.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[58.669,18.365],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.658,1.069],[1.145,0.549],[1.373,0],[1.402,-1.272],[0.201,-2.254]],"o":[[0,-1.502],[-0.658,-1.098],[-1.115,-0.578],[-1.974,0],[-1.374,1.271],[0,0]],"v":[[7.424,-1.734],[6.438,-5.59],[3.734,-8.061],[0.001,-8.928],[-5.064,-7.02],[-7.424,-1.734]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,-2.166],[0.085,-0.838],[0,0],[-1.431,-1.329],[-2.06,0],[-1.116,0.78],[-0.457,1.329],[0,0],[1.889,-1.445],[2.804,0],[1.774,1.012],[1.002,1.849],[0,2.456],[-0.972,1.849],[-1.745,0.982],[-2.288,0],[-1.717,-0.982],[-0.916,-1.733]],"o":[[0,0.752],[0,0],[0.144,2.34],[1.459,1.3],[1.688,0],[1.144,-0.809],[0,0],[-0.629,2.282],[-1.888,1.415],[-2.231,0],[-1.745,-1.011],[-1.001,-1.878],[0,-2.456],[0.973,-1.849],[1.774,-1.012],[2.232,0],[1.716,0.983],[0.944,1.705]],"v":[[11.458,-0.911],[11.331,1.473],[-7.467,1.473],[-5.107,6.978],[0.171,8.928],[4.378,7.758],[6.781,4.551],[10.986,4.551],[7.21,10.141],[0.171,12.264],[-5.837,10.747],[-9.956,6.458],[-11.458,-0.044],[-9.999,-6.501],[-5.923,-10.747],[0.171,-12.264],[6.094,-10.792],[10.042,-6.717]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.699,21.355],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.602,0],[-1.773,-1.763],[0,-3.294],[0,0],[0,0],[0,0],[1.173,1.242],[2.031,0],[1.231,-1.3],[0,-2.485],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.316,0.664]],"o":[[2.861,0],[1.774,1.733],[0,0],[0,0],[0,0],[0,-2.369],[-1.173,-1.272],[-2.06,0],[-1.201,1.3],[0,0],[0,0],[0,0],[0,0],[0,0],[0.772,-1.214],[1.344,-0.665]],"v":[[0.923,-12.092],[7.874,-9.447],[10.535,-1.906],[10.535,12.092],[6.673,12.092],[6.673,-1.344],[4.913,-6.76],[0.107,-8.667],[-4.829,-6.717],[-6.63,-1.04],[-6.63,12.092],[-10.535,12.092],[-10.535,-11.659],[-6.63,-11.659],[-6.63,-8.277],[-3.497,-11.094]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[10.785,21.139],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"logo","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[-44],"e":[0]},{"t":18.000000733155}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[105,25,0],"e":[30,25,0],"to":[-12.5,0,0],"ti":[12.5,0,0]},{"t":37.0000015070409}],"ix":2,"l":2},"a":{"a":0,"k":[25,25,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[6,6,100],"e":[100,100,100]},{"t":21.0000008553475}],"ix":6,"l":2}},"ao":0,"w":50,"h":50,"ip":0,"op":1360.00005539394,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"tipo","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[-5.5,25,0],"e":[5,25,0],"to":[1.75,0,0],"ti":[-17.583,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[5,25,0],"e":[100,25,0],"to":[17.583,0,0],"ti":[-15.833,0,0]},{"t":37.0000015070409}],"ix":2,"l":2},"a":{"a":0,"k":[100,25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[303,-7.5],[205.5,-7],[205.5,56.5],[303,56]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[303,-7.5],[47,-7],[47,56.5],[303,56]],"c":true}]},{"t":37.0000015070409}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"w":200,"h":50,"ip":0,"op":160.000006516934,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/NetbirdKit/ClientState.swift b/NetbirdKit/ClientState.swift
new file mode 100644
index 0000000..3de0c9b
--- /dev/null
+++ b/NetbirdKit/ClientState.swift
@@ -0,0 +1,27 @@
+//
+// ClientState.swift
+// NetBird
+//
+// Created by Pascal Fischer on 09.11.23.
+//
+
+enum ClientState: Codable, CustomStringConvertible {
+ case connected
+ case connecting
+ case disconnected
+ case disconnecting
+
+ var description: String {
+ switch self {
+ case .connected:
+ return "Connected"
+ case .connecting:
+ return "Connecting..."
+ case .disconnected:
+ return "Disconnected"
+ case .disconnecting:
+ return "Disconnecting..."
+
+ }
+ }
+}
diff --git a/NetbirdKit/ConnectionListener.swift b/NetbirdKit/ConnectionListener.swift
new file mode 100644
index 0000000..8fff1f7
--- /dev/null
+++ b/NetbirdKit/ConnectionListener.swift
@@ -0,0 +1,46 @@
+//
+// ConnectionListener.swift
+// NetBird
+//
+// Created by Pascal Fischer on 09.11.23.
+//
+
+import Foundation
+
+class ConnectionListener: NSObject, NetBirdSDKConnectionListenerProtocol {
+
+ var completionHandler: (Error?) -> Void
+
+ var adapter: NetBirdAdapter
+
+ init(adapter: NetBirdAdapter, completionHandler: @escaping (Error?) -> Void) {
+ self.completionHandler = completionHandler
+ self.adapter = adapter
+ }
+
+ func onAddressChanged(_ p0: String?, p1: String?) {
+ // do nothing
+ }
+
+ func onConnected() {
+ adapter.clientState = .connected
+ self.completionHandler(nil)
+ }
+
+ func onConnecting() {
+ adapter.clientState = .connecting
+ }
+
+ func onDisconnected() {
+ adapter.clientState = .disconnected
+ }
+
+ func onDisconnecting() {
+ adapter.clientState = .disconnecting
+ }
+
+ func onPeersListChanged(_ p0: Int) {
+ // do nothing
+ }
+
+}
diff --git a/NetbirdKit/DNSManager.swift b/NetbirdKit/DNSManager.swift
new file mode 100644
index 0000000..c5e67e9
--- /dev/null
+++ b/NetbirdKit/DNSManager.swift
@@ -0,0 +1,50 @@
+//
+// DNSHostManager.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 06.10.23.
+//
+
+import Foundation
+
+struct DomainConfig: Codable {
+ var disabled: Bool
+ var domain: String
+ var matchOnly: Bool
+}
+
+struct HostDNSConfig: Codable {
+ var domains: [DomainConfig]
+ var routeAll: Bool
+ var serverIP: String
+ var serverPort: Int
+}
+
+class DNSManager: NSObject, NetBirdSDKDnsManagerProtocol {
+
+ private weak var tunnelManager: PacketTunnelProviderSettingsManager?
+
+ init(with tunnelManager: PacketTunnelProviderSettingsManager) {
+ self.tunnelManager = tunnelManager
+ }
+
+ func applyDns(_ p0: String?) {
+ if let p0 = p0, !p0.isEmpty {
+ if let config = parseDNSSettingsString(inputString: p0) {
+ self.tunnelManager?.setDNS(config: config)
+ }
+ }
+ }
+
+ func parseDNSSettingsString(inputString: String) -> HostDNSConfig? {
+ guard let jsonData = inputString.data(using: .utf8) else { return nil }
+ do {
+ let config = try JSONDecoder().decode(HostDNSConfig.self, from: jsonData)
+ return config
+ } catch {
+ print(error)
+ }
+ return nil
+ }
+
+}
diff --git a/NetbirdKit/Device.swift b/NetbirdKit/Device.swift
new file mode 100644
index 0000000..863222f
--- /dev/null
+++ b/NetbirdKit/Device.swift
@@ -0,0 +1,22 @@
+//
+// Device.swift
+// GoLibTest
+//
+// Created by Volodymyr Nazarkevych on 28.06.2023.
+//
+
+import UIKit
+
+class Device {
+ static func getName() -> String {
+ return UIDevice.current.name
+ }
+
+ static func getOsVersion() -> String {
+ return UIDevice.current.systemVersion
+ }
+
+ static func getOsName() -> String {
+ return UIDevice.current.systemName
+ }
+}
diff --git a/NetbirdKit/NetworkChangeListener.swift b/NetbirdKit/NetworkChangeListener.swift
new file mode 100644
index 0000000..85267ef
--- /dev/null
+++ b/NetbirdKit/NetworkChangeListener.swift
@@ -0,0 +1,92 @@
+//
+// RouteNotifier.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 03.08.23.
+//
+
+
+import Foundation
+import NetBirdSDK
+import NetworkExtension
+import os
+
+
+class NetworkChangeListener: NSObject, NetBirdSDKNetworkChangeListenerProtocol {
+ func onNetworkChanged(_ p0: String?) {
+ let routes = parseRoutesToNESettings(routesString: p0!)
+ tunnelManager?.setRoutes(routes: routes)
+ }
+
+ private weak var tunnelManager: PacketTunnelProviderSettingsManager?
+
+ var interfaceIP: String?
+
+ init(with tunnelManager: PacketTunnelProviderSettingsManager) {
+ self.tunnelManager = tunnelManager
+ }
+
+ func setInterfaceIP(_ p0: String?) {
+ self.interfaceIP = p0!
+ tunnelManager?.setInterfaceIP(interfaceIP: p0!)
+ }
+
+ func parseRoutesToNESettings(routesString: String) -> [NEIPv4Route] {
+ var neRoutes : [NEIPv4Route] = []
+
+ let routes = routesString.split(separator: ",")
+ for route in routes {
+ neRoutes.append(createIPv4RouteFromCIDR(cidr: String(route)))
+ }
+ if interfaceIP != nil {
+ neRoutes.append(createIPv4RouteFromCIDR(cidr: self.interfaceIP!))
+ }
+ return neRoutes
+ }
+
+ func createIPv4RouteFromCIDR(cidr: String) -> NEIPv4Route {
+ let (ipAddress, subnetMask) = extractIPAddressAndSubnet(from: cidr)!
+ let destinationAddress = subtractSubnetMask(from: ipAddress, subnetMask: subnetMask)
+ return NEIPv4Route(destinationAddress: destinationAddress!, subnetMask: subnetMask)
+ }
+
+}
+
+func extractIPAddressAndSubnet(from cidr: String) -> (String, String)? {
+ let components = cidr.components(separatedBy: "/")
+
+ guard components.count == 2,
+ let ipAddress = components.first,
+ var subnetPrefix = Int(components[1]),
+ subnetPrefix >= 0 && subnetPrefix <= 32 else {
+ return nil
+ }
+
+ var subnetMask = ""
+ for i in 0..<4 {
+ let bits = min(subnetPrefix, 8)
+ let octet = 255 & (255 << (8 - bits))
+ subnetMask += "\(octet)"
+ if i < 3 {
+ subnetMask += "."
+ }
+ subnetPrefix -= bits
+ }
+
+ return (ipAddress, subnetMask)
+}
+
+func subtractSubnetMask(from ipAddress: String, subnetMask: String) -> String? {
+ let ipAddressComponents = ipAddress.split(separator: ".").compactMap { UInt32($0) }
+ let subnetMaskComponents = subnetMask.split(separator: ".").compactMap { UInt32($0) }
+
+ guard ipAddressComponents.count == 4 && subnetMaskComponents.count == 4 else {
+ return nil
+ }
+
+ let networkAddressComponents = zip(ipAddressComponents, subnetMaskComponents).map { $0 & $1 }
+
+ let networkAddress = networkAddressComponents.map { String($0) }.joined(separator: ".")
+
+ return networkAddress
+}
diff --git a/NetbirdKit/NetworkExtensionAdapter.swift b/NetbirdKit/NetworkExtensionAdapter.swift
new file mode 100644
index 0000000..1c2c26e
--- /dev/null
+++ b/NetbirdKit/NetworkExtensionAdapter.swift
@@ -0,0 +1,217 @@
+//
+// NetworkExtensionAdapter.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 02.10.23.
+//
+
+import Foundation
+import NetworkExtension
+import SwiftUI
+
+public class NetworkExtensionAdapter: ObservableObject {
+
+ var session : NETunnelProviderSession?
+ var vpnManager: NETunnelProviderManager?
+
+ var extensionID = "io.netbird.app.NetbirdNetworkExtension"
+ var extensionName = "NetBird Network Extension"
+
+ let decoder = PropertyListDecoder()
+
+ @Published var timer : Timer
+
+ @Published var showBrowser = false
+ @Published var loginURL : String?
+
+ init() {
+ self.timer = Timer()
+ self.timer.invalidate()
+ Task {
+ do {
+ try await self.configureManager()
+ } catch {
+ print("Failed to configure manager")
+ }
+ }
+ }
+
+ deinit {
+ self.timer.invalidate()
+ }
+
+ func start() async {
+ do {
+ try await configureManager()
+ print("extension configured")
+ await loginIfRequired()
+ } catch {
+ print("Failed to start extension: \(error)")
+ }
+ }
+
+ private func configureManager() async throws {
+ let managers = try await NETunnelProviderManager.loadAllFromPreferences()
+ if let manager = managers.first(where: { $0.localizedDescription == self.extensionName }) {
+ self.vpnManager = manager
+ } else {
+ let newManager = createNewManager()
+ try await newManager.saveToPreferences()
+ self.vpnManager = newManager
+ }
+ self.vpnManager?.isEnabled = true
+ try await self.vpnManager?.saveToPreferences()
+ try await self.vpnManager?.loadFromPreferences()
+ self.session = self.vpnManager?.connection as? NETunnelProviderSession
+ }
+
+ private func createNewManager() -> NETunnelProviderManager {
+ let tunnelProviderProtocol = NETunnelProviderProtocol()
+ tunnelProviderProtocol.providerBundleIdentifier = self.extensionID
+ tunnelProviderProtocol.serverAddress = "multiple endpoints"
+
+ let newManager = NETunnelProviderManager()
+ newManager.protocolConfiguration = tunnelProviderProtocol
+ newManager.localizedDescription = self.extensionName
+ newManager.isEnabled = true
+
+ return newManager
+ }
+
+
+
+ public func loginIfRequired() async {
+ if self.isLoginRequired() {
+ print("require login")
+
+ await performLogin()
+ } else {
+ startVPNConnection()
+ }
+
+ print("will start vpn connection")
+ }
+
+ public func isLoginRequired() -> Bool {
+ guard let client = NetBirdSDKNewClient(Preferences.configFile(), Device.getName(), Device.getOsVersion(), Device.getOsName(), nil, nil) else {
+ print("Failed to initialize client")
+ return true
+ }
+ return client.isLoginRequired()
+ }
+
+ class ObserverBox {
+ var observer: NSObjectProtocol?
+ }
+
+ private func performLogin() async {
+ let loginURLString = await withCheckedContinuation { continuation in
+ self.login { urlString in
+ print("urlstring: \(urlString)")
+ continuation.resume(returning: urlString)
+ }
+ }
+
+ self.loginURL = loginURLString
+ self.showBrowser = true
+ }
+
+ public func startVPNConnection() {
+ print("starting tunnel")
+ do {
+ try self.session?.startVPNTunnel()
+ print("VPN Tunnel started.")
+ } catch let error {
+ print("Failed to start VPN tunnel: \(error)")
+ }
+ }
+
+
+ func stop() -> Void {
+ self.vpnManager?.connection.stopVPNTunnel()
+ }
+
+ func login(completion: @escaping (String) -> Void) {
+ if self.session == nil {
+ print("No session available for login")
+ return
+ }
+
+ do {
+ let messageString = "Login"
+ if let messageData = messageString.data(using: .utf8) {
+ // Send the message to the network extension
+ try self.session!.sendProviderMessage(messageData) { response in
+ if let response = response {
+ if let string = String(data: response, encoding: .utf8) {
+ completion(string)
+ return
+ }
+ }
+ }
+ } else {
+ print("Error converting message to Data")
+ }
+ } catch {
+ print("error when performing network extension action")
+ }
+ }
+
+ func fetchData(completion: @escaping (StatusDetails) -> Void) {
+ guard let session = self.session else {
+ let defaultStatus = StatusDetails(ip: "", fqdn: "", managementStatus: .disconnected, peerInfo: [])
+ completion(defaultStatus)
+ return
+ }
+
+ let messageString = "Status"
+ if let messageData = messageString.data(using: .utf8) {
+ do {
+ try session.sendProviderMessage(messageData) { response in
+ if let response = response {
+ do {
+ let decodedStatus = try self.decoder.decode(StatusDetails.self, from: response)
+ completion(decodedStatus)
+ return
+ } catch {
+ print("Failed to decode status details.")
+ }
+ } else {
+ let defaultStatus = StatusDetails(ip: "", fqdn: "", managementStatus: .disconnected, peerInfo: [])
+ completion(defaultStatus)
+ return
+ }
+ }
+ } catch {
+ print("Failed to send Provider message")
+ }
+ } else {
+ print("Error converting message to Data")
+ }
+ }
+
+ func startTimer(completion: @escaping (StatusDetails) -> Void) {
+ self.timer.invalidate()
+ self.fetchData(completion: completion)
+ self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { _ in
+ self.fetchData(completion: completion)
+ })
+ }
+
+ func stopTimer() {
+ self.timer.invalidate()
+ }
+
+ func getExtensionStatus(completion: @escaping (NEVPNStatus) -> Void) {
+ Task {
+ do {
+ let managers = try await NETunnelProviderManager.loadAllFromPreferences()
+ if let manager = managers.first(where: { $0.localizedDescription == self.extensionName }) {
+ completion(manager.connection.status)
+ }
+ } catch {
+ print("Error loading from preferences: \(error)")
+ }
+ }
+ }
+}
diff --git a/NetbirdKit/Preferences.swift b/NetbirdKit/Preferences.swift
new file mode 100644
index 0000000..f434e46
--- /dev/null
+++ b/NetbirdKit/Preferences.swift
@@ -0,0 +1,23 @@
+//
+// Preferences.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 03.08.23.
+//
+
+import Foundation
+import NetBirdSDK
+
+class Preferences {
+ static func newPreferences() -> NetBirdSDKPreferences {
+ return NetBirdSDKNewPreferences(configFile())!
+ }
+
+ static func configFile() -> String {
+ let fileManager = FileManager.default
+ let groupURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.io.netbird.app")
+ let logURL = groupURL?.appendingPathComponent("netbird.cfg")
+ return logURL!.relativePath
+ }
+
+}
diff --git a/NetbirdKit/StatusDetails.swift b/NetbirdKit/StatusDetails.swift
new file mode 100644
index 0000000..538e0f6
--- /dev/null
+++ b/NetbirdKit/StatusDetails.swift
@@ -0,0 +1,22 @@
+//
+// StatusDetails.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 10.10.23.
+//
+
+import Foundation
+
+struct StatusDetails: Codable {
+ var ip: String
+ var fqdn: String
+ var managementStatus: ClientState
+ var peerInfo: [PeerInfo]
+}
+
+struct PeerInfo: Codable, Identifiable, Equatable {
+ var id = UUID()
+ var ip: String
+ var fqdn: String
+ var connStatus: String
+}
diff --git a/NetbirdNetworkExtension/Info.plist b/NetbirdNetworkExtension/Info.plist
new file mode 100644
index 0000000..1f39ed3
--- /dev/null
+++ b/NetbirdNetworkExtension/Info.plist
@@ -0,0 +1,15 @@
+
+
+
+
+ FirebaseAppGroup
+ group.io.netbird.app
+ NSExtension
+
+ NSExtensionPointIdentifier
+ com.apple.networkextension.packet-tunnel
+ NSExtensionPrincipalClass
+ $(PRODUCT_MODULE_NAME).PacketTunnelProvider
+
+
+
diff --git a/NetbirdNetworkExtension/NetBirdAdapter.swift b/NetbirdNetworkExtension/NetBirdAdapter.swift
new file mode 100644
index 0000000..36f40cd
--- /dev/null
+++ b/NetbirdNetworkExtension/NetBirdAdapter.swift
@@ -0,0 +1,124 @@
+//
+// NetBirdAdapter.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 08.08.23.
+//
+
+import Foundation
+import NetworkExtension
+import NetBirdSDK
+import os
+
+public class NetBirdAdapter {
+
+ /// Packet tunnel provider.
+ private weak var packetTunnelProvider: PacketTunnelProvider?
+
+ private weak var tunnelManager: PacketTunnelProviderSettingsManager?
+
+ public let client : NetBirdSDKClient
+ private let networkChangeListener : NetworkChangeListener
+ private let dnsManager: DNSManager
+
+ public var isExecutingLogin = false
+
+ var clientState : ClientState = .disconnected
+
+ /// Tunnel device file descriptor.
+ public var tunnelFileDescriptor: Int32? {
+ var ctlInfo = ctl_info()
+ withUnsafeMutablePointer(to: &ctlInfo.ctl_name) {
+ $0.withMemoryRebound(to: CChar.self, capacity: MemoryLayout.size(ofValue: $0.pointee)) {
+ _ = strcpy($0, "com.apple.net.utun_control")
+ }
+ }
+ for fd: Int32 in 0...1024 {
+ var addr = sockaddr_ctl()
+ var ret: Int32 = -1
+ var len = socklen_t(MemoryLayout.size(ofValue: addr))
+ withUnsafeMutablePointer(to: &addr) {
+ $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
+ ret = getpeername(fd, $0, &len)
+ }
+ }
+ if ret != 0 || addr.sc_family != AF_SYSTEM {
+ continue
+ }
+ if ctlInfo.ctl_id == 0 {
+ ret = ioctl(fd, CTLIOCGINFO, &ctlInfo)
+ if ret != 0 {
+ continue
+ }
+ }
+ if addr.sc_id == ctlInfo.ctl_id {
+ return fd
+ }
+ }
+ return nil
+ }
+
+ // MARK: - Initialization
+
+ /// Designated initializer.
+ /// - Parameter packetTunnelProvider: an instance of `NEPacketTunnelProvider`. Internally stored
+ /// as a weak reference.
+ init(with tunnelManager: PacketTunnelProviderSettingsManager) {
+ self.tunnelManager = tunnelManager
+ self.networkChangeListener = NetworkChangeListener(with: tunnelManager)
+ self.dnsManager = DNSManager(with: tunnelManager)
+ self.client = NetBirdSDKNewClient(Preferences.configFile(), Device.getName(), Device.getOsVersion(), Device.getOsName(), self.networkChangeListener, self.dnsManager)!
+ }
+
+ /// Returns the tunnel device interface name, or nil on error.
+ /// - Returns: String.
+ public var interfaceName: String? {
+ guard let tunnelFileDescriptor = self.tunnelFileDescriptor else { return nil }
+
+ var buffer = [UInt8](repeating: 0, count: Int(IFNAMSIZ))
+
+ return buffer.withUnsafeMutableBufferPointer { mutableBufferPointer in
+ guard let baseAddress = mutableBufferPointer.baseAddress else { return nil }
+
+ var ifnameSize = socklen_t(IFNAMSIZ)
+ let result = getsockopt(
+ tunnelFileDescriptor,
+ 2 /* SYSPROTO_CONTROL */,
+ 2 /* UTUN_OPT_IFNAME */,
+ baseAddress,
+ &ifnameSize)
+
+ if result == 0 {
+ return String(cString: baseAddress)
+ } else {
+ return nil
+ }
+ }
+ }
+
+ public func start(completionHandler: @escaping (Error?) -> Void) {
+ DispatchQueue.global().async {
+ do {
+ let connectionListener = ConnectionListener(adapter: self, completionHandler: completionHandler)
+ self.client.setConnectionListener(connectionListener)
+ try self.client.run(self.tunnelFileDescriptor ?? 0, interfaceName: self.interfaceName)
+ } catch {
+ completionHandler(NSError(domain: "io.netbird.NetbirdNetworkExtension", code: 1001, userInfo: [NSLocalizedDescriptionKey: "Netbird client startup failed."]))
+ self.stop()
+ }
+ }
+ }
+
+ public func needsLogin() -> Bool {
+ return self.client.isLoginRequired()
+ }
+
+ public func login() -> String {
+ self.isExecutingLogin = true
+ return self.client.loginForMobile()
+ }
+
+ public func stop() {
+ self.client.stop()
+ }
+}
diff --git a/NetbirdNetworkExtension/NetbirdNetworkExtension.entitlements b/NetbirdNetworkExtension/NetbirdNetworkExtension.entitlements
new file mode 100644
index 0000000..476b633
--- /dev/null
+++ b/NetbirdNetworkExtension/NetbirdNetworkExtension.entitlements
@@ -0,0 +1,14 @@
+
+
+
+
+ com.apple.developer.networking.networkextension
+
+ packet-tunnel-provider
+
+ com.apple.security.application-groups
+
+ group.io.netbird.app
+
+
+
diff --git a/NetbirdNetworkExtension/PacketTunnelProvider.swift b/NetbirdNetworkExtension/PacketTunnelProvider.swift
new file mode 100644
index 0000000..b4e49ff
--- /dev/null
+++ b/NetbirdNetworkExtension/PacketTunnelProvider.swift
@@ -0,0 +1,175 @@
+//
+// PacketTunnelProvider.swift
+// NetbirdNetworkExtension
+//
+// Created by Pascal Fischer on 06.08.23.
+//
+
+import NetworkExtension
+import os
+import Firebase
+import FirebaseCrashlytics
+import FirebaseCore
+import FirebasePerformance
+
+
+class PacketTunnelProvider: NEPacketTunnelProvider {
+
+ private lazy var tunnelManager: PacketTunnelProviderSettingsManager = {
+ return PacketTunnelProviderSettingsManager(with: self)
+ }()
+
+ private lazy var adapter: NetBirdAdapter = {
+ return NetBirdAdapter(with: self.tunnelManager)
+ }()
+
+ override init() {
+ initializeLogging()
+ }
+
+ override func startTunnel(options: [String : NSObject]?, completionHandler: @escaping (Error?) -> Void) {
+ let options = FirebaseOptions(contentsOfFile: Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!)
+ FirebaseApp.configure(options: options!)
+
+ if adapter.needsLogin() {
+ DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+ completionHandler(NSError(domain: "io.netbird.NetbirdNetworkExtension", code: 1001, userInfo: [NSLocalizedDescriptionKey: "Login required."]))
+ }
+ return
+ }
+
+ adapter.start(completionHandler: completionHandler)
+ }
+
+ override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
+ adapter.stop()
+ DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
+ completionHandler()
+ }
+ }
+
+ override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) {
+ guard let completionHandler = completionHandler else { return }
+
+ if let string = String(data: messageData, encoding: .utf8) {
+ switch string {
+ case "Login":
+ login(completionHandler: completionHandler)
+ case "Status":
+ getStatus(completionHandler: completionHandler)
+ default:
+ print("unknown message")
+ }
+ }
+ }
+
+ func login(completionHandler: ((Data?) -> Void)) {
+ let url = adapter.login()
+ let data = url.data(using: .utf8)
+ completionHandler(data)
+ }
+
+ func getStatus(completionHandler: ((Data?) -> Void)) {
+ let statusDetailsMessage = adapter.client.getStatusDetails()
+ var peerInfoArray: [PeerInfo] = []
+ guard let statusDetailsMessage = statusDetailsMessage else {
+ print("Did not receive status details")
+ return
+ }
+ for i in 0.. Void) {
+ // Add code here to get ready to sleep.
+ completionHandler()
+ }
+
+ override func wake() {
+ // Add code here to wake up.
+ }
+
+ func setTunnelSettings(tunnelNetworkSettings: NEPacketTunnelNetworkSettings) {
+ setTunnelNetworkSettings(tunnelNetworkSettings) { error in
+ if let error = error {
+ // Handle Error
+ print("error when assigning routes")
+ return
+ }
+ print("Routes set")
+ }
+ }
+}
+
+func initializeLogging() {
+ let fileManager = FileManager.default
+
+ let groupURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.io.netbird.app")
+ let logURL = groupURL?.appendingPathComponent("logfile.log")
+
+ var error: NSError?
+ var success = false
+
+ let logMessage = "Starting new log file from extension" + "\n"
+
+ guard let logURLValid = logURL else {
+ print("Failed to get the log file URL.")
+ return
+ }
+
+ if fileManager.fileExists(atPath: logURLValid.path) {
+ // If the log file already exists, append the new message
+ if let fileHandle = try? FileHandle(forWritingTo: logURLValid) {
+ do {
+ try "".write(to: logURLValid, atomically: true, encoding: .utf8)
+ } catch {
+ print("Error handling the log file: \(error)")
+ }
+ if let data = logMessage.data(using: .utf8) {
+ fileHandle.write(data)
+ }
+ fileHandle.closeFile()
+ } else {
+ print("Failed to open the log file for writing.")
+ }
+ } else {
+ // If the log file doesn't exist, create and write the new message
+ do {
+ try logMessage.write(to: logURLValid, atomically: true, encoding: .utf8)
+ } catch {
+ print("Failed to write to the log file: \(error.localizedDescription)")
+ }
+ }
+
+ if let logPath = logURL?.path {
+
+ success = NetBirdSDKInitializeLog("DEBUG", logPath, &error)
+ }
+ if !success, let actualError = error {
+ print("Failed to initialize log: \(actualError.localizedDescription)")
+ }
+}
+
diff --git a/NetbirdNetworkExtension/PacketTunnelProviderSettingsManager.swift b/NetbirdNetworkExtension/PacketTunnelProviderSettingsManager.swift
new file mode 100644
index 0000000..1ae50c1
--- /dev/null
+++ b/NetbirdNetworkExtension/PacketTunnelProviderSettingsManager.swift
@@ -0,0 +1,93 @@
+//
+// PacketTunnelProviderSettingsManager.swift
+// NetBirdiOS
+//
+// Created by Pascal Fischer on 06.10.23.
+//
+
+import Foundation
+import NetworkExtension
+
+class PacketTunnelProviderSettingsManager {
+
+ private weak var packetTunnelProvider: PacketTunnelProvider?
+
+ private var interfaceIP: String?
+ private var routes: [NEIPv4Route]?
+ private var dnsSettings: NEDNSSettings?
+
+ init(with packetTunnelProvider: PacketTunnelProvider) {
+ self.packetTunnelProvider = packetTunnelProvider
+ }
+
+ func setRoutes(routes: [NEIPv4Route]) {
+ self.routes = routes
+ self.updateTunnel()
+ }
+
+ func setDNS(config: HostDNSConfig) {
+ let dnsSettings = NEDNSSettings(servers: [config.serverIP])
+ if config.routeAll {
+ dnsSettings.matchDomains = [""]
+ } else {
+ var searchDomains: [String] = []
+ var matchDomains: [String] = []
+ for domain in config.domains {
+ if domain.disabled {
+ continue
+ }
+ matchDomains.append(domain.domain)
+ if !domain.matchOnly {
+ searchDomains.append(domain.domain)
+ }
+ }
+ dnsSettings.matchDomains = matchDomains
+ dnsSettings.searchDomains = searchDomains
+ }
+ self.dnsSettings = dnsSettings
+ self.updateTunnel()
+ }
+
+ func setInterfaceIP(interfaceIP: String) {
+ self.interfaceIP = interfaceIP
+ }
+
+ func getInterfaceIP() -> String? {
+ return self.interfaceIP
+ }
+
+ private func updateTunnel() {
+ if let tunnelSettings = createTunnelSettings() {
+ self.packetTunnelProvider!.setTunnelSettings(tunnelNetworkSettings: tunnelSettings)
+ } else {
+ print("Failed to update tunnel")
+ }
+ }
+
+ private func createTunnelSettings() -> NEPacketTunnelNetworkSettings? {
+ if let interfaceIP = interfaceIP {
+ if let (ipAddress, subnetMask) = extractIPAddressAndSubnet(from: interfaceIP) {
+ let tunnelNetworkSettings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: ipAddress)
+ let ipv4Settings = NEIPv4Settings(addresses: [ipAddress], subnetMasks: [subnetMask])
+
+ ipv4Settings.includedRoutes = [ NEIPv4Route(destinationAddress: ipAddress, subnetMask: subnetMask) ]
+
+ if self.routes != nil {
+ ipv4Settings.includedRoutes = self.routes
+ }
+ tunnelNetworkSettings.ipv4Settings = ipv4Settings
+
+ tunnelNetworkSettings.mtu = 1280
+
+ if self.dnsSettings != nil {
+ tunnelNetworkSettings.dnsSettings = self.dnsSettings
+ }
+
+ return tunnelNetworkSettings
+ }
+ }
+
+ return nil
+ }
+
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..03fa40b
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# NetBird ios-client
diff --git a/WireGuardKitC/WireGuardKitC.h b/WireGuardKitC/WireGuardKitC.h
new file mode 100644
index 0000000..54e4783
--- /dev/null
+++ b/WireGuardKitC/WireGuardKitC.h
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: MIT
+// Copyright © 2018-2023 WireGuard LLC. All Rights Reserved.
+
+#include "key.h"
+#include "x25519.h"
+
+/* From */
+#define CTLIOCGINFO 0xc0644e03UL
+struct ctl_info {
+ u_int32_t ctl_id;
+ char ctl_name[96];
+};
+struct sockaddr_ctl {
+ u_char sc_len;
+ u_char sc_family;
+ u_int16_t ss_sysaddr;
+ u_int32_t sc_id;
+ u_int32_t sc_unit;
+ u_int32_t sc_reserved[5];
+};
diff --git a/WireGuardKitC/key.c b/WireGuardKitC/key.c
new file mode 100644
index 0000000..84e7f16
--- /dev/null
+++ b/WireGuardKitC/key.c
@@ -0,0 +1,124 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright (C) 2015-2019 Jason A. Donenfeld . All Rights Reserved.
+ *
+ * This is a specialized constant-time base64/hex implementation that resists side-channel attacks.
+ */
+
+#include
+#include "key.h"
+
+static inline void encode_base64(char dest[static 4], const uint8_t src[static 3])
+{
+ const uint8_t input[] = { (src[0] >> 2) & 63, ((src[0] << 4) | (src[1] >> 4)) & 63, ((src[1] << 2) | (src[2] >> 6)) & 63, src[2] & 63 };
+
+ for (unsigned int i = 0; i < 4; ++i)
+ dest[i] = input[i] + 'A'
+ + (((25 - input[i]) >> 8) & 6)
+ - (((51 - input[i]) >> 8) & 75)
+ - (((61 - input[i]) >> 8) & 15)
+ + (((62 - input[i]) >> 8) & 3);
+
+}
+
+void key_to_base64(char base64[static WG_KEY_LEN_BASE64], const uint8_t key[static WG_KEY_LEN])
+{
+ unsigned int i;
+
+ for (i = 0; i < WG_KEY_LEN / 3; ++i)
+ encode_base64(&base64[i * 4], &key[i * 3]);
+ encode_base64(&base64[i * 4], (const uint8_t[]){ key[i * 3 + 0], key[i * 3 + 1], 0 });
+ base64[WG_KEY_LEN_BASE64 - 2] = '=';
+ base64[WG_KEY_LEN_BASE64 - 1] = '\0';
+}
+
+static inline int decode_base64(const char src[static 4])
+{
+ int val = 0;
+
+ for (unsigned int i = 0; i < 4; ++i)
+ val |= (-1
+ + ((((('A' - 1) - src[i]) & (src[i] - ('Z' + 1))) >> 8) & (src[i] - 64))
+ + ((((('a' - 1) - src[i]) & (src[i] - ('z' + 1))) >> 8) & (src[i] - 70))
+ + ((((('0' - 1) - src[i]) & (src[i] - ('9' + 1))) >> 8) & (src[i] + 5))
+ + ((((('+' - 1) - src[i]) & (src[i] - ('+' + 1))) >> 8) & 63)
+ + ((((('/' - 1) - src[i]) & (src[i] - ('/' + 1))) >> 8) & 64)
+ ) << (18 - 6 * i);
+ return val;
+}
+
+bool key_from_base64(uint8_t key[static WG_KEY_LEN], const char *base64)
+{
+ unsigned int i;
+ volatile uint8_t ret = 0;
+ int val;
+
+ if (strlen(base64) != WG_KEY_LEN_BASE64 - 1 || base64[WG_KEY_LEN_BASE64 - 2] != '=')
+ return false;
+
+ for (i = 0; i < WG_KEY_LEN / 3; ++i) {
+ val = decode_base64(&base64[i * 4]);
+ ret |= (uint32_t)val >> 31;
+ key[i * 3 + 0] = (val >> 16) & 0xff;
+ key[i * 3 + 1] = (val >> 8) & 0xff;
+ key[i * 3 + 2] = val & 0xff;
+ }
+ val = decode_base64((const char[]){ base64[i * 4 + 0], base64[i * 4 + 1], base64[i * 4 + 2], 'A' });
+ ret |= ((uint32_t)val >> 31) | (val & 0xff);
+ key[i * 3 + 0] = (val >> 16) & 0xff;
+ key[i * 3 + 1] = (val >> 8) & 0xff;
+
+ return 1 & ((ret - 1) >> 8);
+}
+
+void key_to_hex(char hex[static WG_KEY_LEN_HEX], const uint8_t key[static WG_KEY_LEN])
+{
+ unsigned int i;
+
+ for (i = 0; i < WG_KEY_LEN; ++i) {
+ hex[i * 2] = 87U + (key[i] >> 4) + ((((key[i] >> 4) - 10U) >> 8) & ~38U);
+ hex[i * 2 + 1] = 87U + (key[i] & 0xf) + ((((key[i] & 0xf) - 10U) >> 8) & ~38U);
+ }
+ hex[i * 2] = '\0';
+}
+
+bool key_from_hex(uint8_t key[static WG_KEY_LEN], const char *hex)
+{
+ uint8_t c, c_acc, c_alpha0, c_alpha, c_num0, c_num, c_val;
+ volatile uint8_t ret = 0;
+
+ if (strlen(hex) != WG_KEY_LEN_HEX - 1)
+ return false;
+
+ for (unsigned int i = 0; i < WG_KEY_LEN_HEX - 1; i += 2) {
+ c = (uint8_t)hex[i];
+ c_num = c ^ 48U;
+ c_num0 = (c_num - 10U) >> 8;
+ c_alpha = (c & ~32U) - 55U;
+ c_alpha0 = ((c_alpha - 10U) ^ (c_alpha - 16U)) >> 8;
+ ret |= ((c_num0 | c_alpha0) - 1) >> 8;
+ c_val = (c_num0 & c_num) | (c_alpha0 & c_alpha);
+ c_acc = c_val * 16U;
+
+ c = (uint8_t)hex[i + 1];
+ c_num = c ^ 48U;
+ c_num0 = (c_num - 10U) >> 8;
+ c_alpha = (c & ~32U) - 55U;
+ c_alpha0 = ((c_alpha - 10U) ^ (c_alpha - 16U)) >> 8;
+ ret |= ((c_num0 | c_alpha0) - 1) >> 8;
+ c_val = (c_num0 & c_num) | (c_alpha0 & c_alpha);
+ key[i / 2] = c_acc | c_val;
+ }
+
+ return 1 & ((ret - 1) >> 8);
+}
+
+bool key_eq(const uint8_t key1[static WG_KEY_LEN], const uint8_t key2[static WG_KEY_LEN])
+{
+ volatile uint8_t acc = 0;
+ for (unsigned int i = 0; i < WG_KEY_LEN; ++i) {
+ acc |= key1[i] ^ key2[i];
+ asm volatile("" : "=r"(acc) : "0"(acc));
+ }
+ return 1 & ((acc - 1) >> 8);
+}
diff --git a/WireGuardKitC/key.h b/WireGuardKitC/key.h
new file mode 100644
index 0000000..5353ade
--- /dev/null
+++ b/WireGuardKitC/key.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright (C) 2015-2019 Jason A. Donenfeld . All Rights Reserved.
+ */
+
+#ifndef KEY_H
+#define KEY_H
+
+#include
+#include
+
+#define WG_KEY_LEN (32)
+#define WG_KEY_LEN_BASE64 (45)
+#define WG_KEY_LEN_HEX (65)
+
+void key_to_base64(char base64[static WG_KEY_LEN_BASE64], const uint8_t key[static WG_KEY_LEN]);
+bool key_from_base64(uint8_t key[static WG_KEY_LEN], const char *base64);
+
+void key_to_hex(char hex[static WG_KEY_LEN_HEX], const uint8_t key[static WG_KEY_LEN]);
+bool key_from_hex(uint8_t key[static WG_KEY_LEN], const char *hex);
+
+bool key_eq(const uint8_t key1[static WG_KEY_LEN], const uint8_t key2[static WG_KEY_LEN]);
+
+#endif
diff --git a/WireGuardKitC/module.modulemap b/WireGuardKitC/module.modulemap
new file mode 100644
index 0000000..26b45bf
--- /dev/null
+++ b/WireGuardKitC/module.modulemap
@@ -0,0 +1,4 @@
+module WireGuardKitC {
+ umbrella header "WireGuardKitC.h"
+ export *
+}
diff --git a/WireGuardKitC/x25519.c b/WireGuardKitC/x25519.c
new file mode 100644
index 0000000..7793299
--- /dev/null
+++ b/WireGuardKitC/x25519.c
@@ -0,0 +1,178 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2015-2019 Jason A. Donenfeld . All Rights Reserved.
+ *
+ * Curve25519 ECDH functions, based on TweetNaCl but cleaned up.
+ */
+
+#include
+#include
+#include
+#include
+
+#include "x25519.h"
+
+typedef int64_t fe[16];
+
+static inline void carry(fe o)
+{
+ int i;
+
+ for (i = 0; i < 16; ++i) {
+ o[(i + 1) % 16] += (i == 15 ? 38 : 1) * (o[i] >> 16);
+ o[i] &= 0xffff;
+ }
+}
+
+static inline void cswap(fe p, fe q, int b)
+{
+ int i;
+ int64_t t, c = ~(b - 1);
+
+ for (i = 0; i < 16; ++i) {
+ t = c & (p[i] ^ q[i]);
+ p[i] ^= t;
+ q[i] ^= t;
+ }
+}
+
+static inline void pack(uint8_t *o, const fe n)
+{
+ int i, j, b;
+ fe m, t;
+
+ memcpy(t, n, sizeof(t));
+ carry(t);
+ carry(t);
+ carry(t);
+ for (j = 0; j < 2; ++j) {
+ m[0] = t[0] - 0xffed;
+ for (i = 1; i < 15; ++i) {
+ m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1);
+ m[i - 1] &= 0xffff;
+ }
+ m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1);
+ b = (m[15] >> 16) & 1;
+ m[14] &= 0xffff;
+ cswap(t, m, 1 - b);
+ }
+ for (i = 0; i < 16; ++i) {
+ o[2 * i] = t[i] & 0xff;
+ o[2 * i + 1] = t[i] >> 8;
+ }
+}
+
+static inline void unpack(fe o, const uint8_t *n)
+{
+ int i;
+
+ for (i = 0; i < 16; ++i)
+ o[i] = n[2 * i] + ((int64_t)n[2 * i + 1] << 8);
+ o[15] &= 0x7fff;
+}
+
+static inline void add(fe o, const fe a, const fe b)
+{
+ int i;
+
+ for (i = 0; i < 16; ++i)
+ o[i] = a[i] + b[i];
+}
+
+static inline void subtract(fe o, const fe a, const fe b)
+{
+ int i;
+
+ for (i = 0; i < 16; ++i)
+ o[i] = a[i] - b[i];
+}
+
+static inline void multmod(fe o, const fe a, const fe b)
+{
+ int i, j;
+ int64_t t[31] = { 0 };
+
+ for (i = 0; i < 16; ++i) {
+ for (j = 0; j < 16; ++j)
+ t[i + j] += a[i] * b[j];
+ }
+ for (i = 0; i < 15; ++i)
+ t[i] += 38 * t[i + 16];
+ memcpy(o, t, sizeof(fe));
+ carry(o);
+ carry(o);
+}
+
+static inline void invert(fe o, const fe i)
+{
+ fe c;
+ int a;
+
+ memcpy(c, i, sizeof(c));
+ for (a = 253; a >= 0; --a) {
+ multmod(c, c, c);
+ if (a != 2 && a != 4)
+ multmod(c, c, i);
+ }
+ memcpy(o, c, sizeof(fe));
+}
+
+static void curve25519_shared_secret(uint8_t shared_secret[32], const uint8_t private_key[32], const uint8_t public_key[32])
+{
+ static const fe a24 = { 0xdb41, 1 };
+ uint8_t z[32];
+ int64_t r;
+ int i;
+ fe a = { 1 }, b, c = { 0 }, d = { 1 }, e, f, x;
+
+ memcpy(z, private_key, sizeof(z));
+
+ z[31] = (z[31] & 127) | 64;
+ z[0] &= 248;
+
+ unpack(x, public_key);
+ memcpy(b, x, sizeof(b));
+
+ for (i = 254; i >= 0; --i) {
+ r = (z[i >> 3] >> (i & 7)) & 1;
+ cswap(a, b, (int)r);
+ cswap(c, d, (int)r);
+ add(e, a, c);
+ subtract(a, a, c);
+ add(c, b, d);
+ subtract(b, b, d);
+ multmod(d, e, e);
+ multmod(f, a, a);
+ multmod(a, c, a);
+ multmod(c, b, e);
+ add(e, a, c);
+ subtract(a, a, c);
+ multmod(b, a, a);
+ subtract(c, d, f);
+ multmod(a, c, a24);
+ add(a, a, d);
+ multmod(c, c, a);
+ multmod(a, d, f);
+ multmod(d, b, x);
+ multmod(b, e, e);
+ cswap(a, b, (int)r);
+ cswap(c, d, (int)r);
+ }
+ invert(c, c);
+ multmod(a, a, c);
+ pack(shared_secret, a);
+}
+
+void curve25519_derive_public_key(uint8_t public_key[32], const uint8_t private_key[32])
+{
+ static const uint8_t basepoint[32] = { 9 };
+
+ curve25519_shared_secret(public_key, private_key, basepoint);
+}
+
+void curve25519_generate_private_key(uint8_t private_key[32])
+{
+ assert(CCRandomGenerateBytes(private_key, 32) == kCCSuccess);
+ private_key[31] = (private_key[31] & 127) | 64;
+ private_key[0] &= 248;
+}
diff --git a/WireGuardKitC/x25519.h b/WireGuardKitC/x25519.h
new file mode 100644
index 0000000..7d8440d
--- /dev/null
+++ b/WireGuardKitC/x25519.h
@@ -0,0 +1,7 @@
+#ifndef X25519_H
+#define X25519_H
+
+void curve25519_derive_public_key(unsigned char public_key[32], const unsigned char private_key[32]);
+void curve25519_generate_private_key(unsigned char private_key[32]);
+
+#endif
diff --git a/build-go-lib.sh b/build-go-lib.sh
new file mode 100755
index 0000000..21efe53
--- /dev/null
+++ b/build-go-lib.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+set -e
+
+rn_app_path=$(pwd)
+netbirdPath=$1
+if [ -z "${1+x}" ]
+then
+ netbirdPath=${GOPATH}/src/github.com/netbirdio/netbird
+fi
+
+version=$2
+if [ -z "${2+x}" ]
+then
+ version=development
+fi
+
+cd $netbirdPath
+gomobile init
+CGO_ENABLED=0 gomobile bind -target=ios -bundleid=io.netbird.framework -ldflags="-X github.com/netbirdio/netbird/version.version=$version" -o $rn_app_path/NetBirdSDK.xcframework $netbirdPath/client/ios/NetBirdSDK
+
+cd -