Home

Awesome

Please read this notice first before continuing.

Angular Seed Advanced

Angular Style Guide Build Status MIT license Dependency Status devDependency Status

This is an advanced seed project for Angular apps based on Minko Gechev's angular-seed that expands on all of its great features to include core support for:

Integration with:

Multiple Platforms
The zen of multiple platforms. Chrome, Android and iPhone all running the same code.
Desktop
Programming Nirvana. Mac and Windows desktop both running the same code.

Table of Contents

Advice: If your project is intended to target a single platform (i.e, web only), then angular-seed is likely more than suitable for your needs. However if your project goals are to target multiple platforms (web, native mobile and native desktop), with powerful out of the box library support and highly configurable/flexible testing options, then you might want to keep reading.

Too Much?!: Don't worry it's ok, I completely understand. There is a simplified version of this seed which still allows web + mobile + desktop without the extra libraries and features like ngrx or analytics. Give this a shot: https://github.com/jlooper/angular-starter

It's built with a lot of the same structure found here so things work the same but is definitely easier to start with if just getting into multi-platform development.

Prerequisites

Note you should have node v6.5.0 or higher and npm 3.10.3 or higher.

npm install -g nativescript

How to start

# install the project's dependencies
$ npm install
# fast install (via Yarn, https://yarnpkg.com)
$ yarn install  # or yarn

# watches your files and uses livereload by default
$ npm start
# api document for the app
# npm run build.docs

# generate api documentation
$ npm run compodoc
$ npm run serve.compodoc

# to start deving with livereload site and coverage as well as continuous testing
$ npm run start.deving

# dev build
$ npm run build.dev
# prod build
$ npm run build.prod

How to start with AoT

Note that AoT compilation requires node v6.5.0 or higher and npm 3.10.3 or higher.

In order to start the seed with AoT use:

# prod build with AoT compilation, will output the production application in `dist/prod`
# the produced code can be deployed (rsynced) to a remote server
$ npm run build.prod.aot

Mobile app

The mobile app is provided via NativeScript, an open source framework for building truly native mobile apps.

Setup

npm install -g nativescript 

Dev Workflow

You can make changes to files in src/client/app or nativescript/src/app folders. A symbolic link exists between the web src/client/app and the nativescript/src/app folder so changes in either location are mirrored because they are the same directory inside.

Create .tns.html and .tns.scss NativeScript view files for every web component view file you have. You will see an example of the app.component.html as a NativeScript view file here.

The root module for the mobile app is nativescript/src/native.module.ts: NativeModule.

Run

iOS:                      npm run start.ios   
iOS (device):             npm run start.ios.device

// or...

Android:                      npm run start.android
Android (device):             npm run start.android.device

OR...

Building with Webpack for release builds

Create AoT builds for deployment to App Store and Google Play.

Android:   npm run build.android
iOS:       npm run build.ios

Desktop app

The desktop app is provided via Electron, cross platform desktop apps with JavaScript, HTML, and CSS.

Develop

Mac:      npm run start.desktop
Windows:  npm run start.desktop.windows

Develop with livesync

Mac:      npm run start.livesync.desktop
Windows:  npm run start.livesync.desktop.windows

Release: Package Electron App for Mac, Windows or Linux

Mac:      npm run build.desktop.mac
Windows:  npm run build.desktop.windows
Linux:    npm run build.desktop.linux

Running tests

$ npm test

# Development. Your app will be watched by karma
# on each change all your specs will be executed.
$ npm run test.watch
# NB: The command above might fail with a "EMFILE: too many open files" error.
# Some OS have a small limit of opened file descriptors (256) by default
# and will result in the EMFILE error.
# You can raise the maximum of file descriptors by running the command below:
$ ulimit -n 10480


# code coverage (istanbul)
# auto-generated at the end of `npm test`
# view coverage report:
$ npm run serve.coverage

# e2e (aka. end-to-end, integration) - In three different shell windows
# Make sure you don't have a global instance of Protractor

# npm install webdriver-manager <- Install this first for e2e testing
# npm run webdriver-update <- You will need to run this the first time
$ npm run webdriver-start
$ npm run serve.e2e
$ npm run e2e

# e2e live mode - Protractor interactive mode
# Instead of last command above, you can use:
$ npm run e2e.live

You can learn more about Protractor Interactive Mode here

Web configuration options

Default application server configuration

var PORT             = 5555;
var LIVE_RELOAD_PORT = 4002;
var DOCS_PORT        = 4003;
var APP_BASE         = '/';

Configure at runtime

npm start -- --port 8080 --reload-port 4000 --base /my-app/

Environment configuration

If you have different environments and you need to configure them to use different end points, settings, etc. you can use the files dev.ts or prod.ts in./tools/env/. The name of the file is environment you want to use.

The environment can be specified by using:

$ npm start -- --env-config ENV_NAME

Currently the ENV_NAMEs are dev, prod, staging, but you can simply add a different file "ENV_NAME.ts". file in order to alter extra such environments.

Tools documentation

A documentation of the provided tools can be found in tools/README.md.

Code organization overview

How-tos

i18n

Logging

General best practice guide to sharing code

There’s actually only a few things to keep in mind when sharing code between web/mobile. The seed does take care of quite a few of those things but here’s a brief list:

If you were thinking about doing: alert('Something happened!');, Don't. Instead inject WindowService:

constructor(private win: WindowService) {}

public userAction() {
  if (success) {
    // do stuff
  } else {
    this.win.alert('Something happened!');
  }
}

This ensures that when the same code is run in the {N} app, the native dialogs module will be used.

The advice I like to give is:

Code with web mentality first. Then provide the native capability using Angular’s {provide: SomeWebService, useClass: SomeNativeService } during bootstrap.

There are some cases where you may want to use useValue vs. useClass, and other times may need to use useFactory. Read the Angular docs here to learn more about which you may need for your use case.

How best to use for your project

Setup

NOTE: This should be done first before you start making any changes and building out your project.

  1. git clone https://github.com/NathanWalker/angular-seed-advanced.git [your-project-name]
  2. cd [your-project-name]
  3. git remote set-url origin [your-project-git-repo] - This will setup origin properly.
  4. git remote add upstream https://github.com/NathanWalker/angular-seed-advanced.git - This will setup upstream properly to merge in upstream changes later.
  5. git push - Go ahead and push up the initial project.
  6. Now you have git setup and ready to develop your app as well as merge in upstream changes in the future.
  7. npm install (and all other usage docs in this README apply) - continue following instructions here.
  8. Create a new folder (or several sub-folders) for your app in src/client/app/shared to build your codebase out. Say your app is called AwesomeApp, then create awesomeapp and start building out all your components and services in there. Create other frameworks as you see fit to organize.

Merging latest upstream changes

  1. git fetch upstream - This will fetch latest upstream.
  2. git merge upstream/master - This will merge in upstream changes.
  3. Handle any conflicts to get latest upstream into your app.
  4. Continue building your app.

You can read more about syncing a fork here.

If you have any suggestions to this workflow, please post here.

Dockerization

The application provides full Docker support. You can use it for both development as well as production builds and deployments.

How to build and start the dockerized version of the application

The Dockerization infrastructure is described in the docker-compose.yml (respectively docker-compose.production.yml. The application consists of two containers:

Development build and deployment

Run the following:

$ docker-compose build
$ docker-compose up -d

Now open your browser at http://localhost:5555

Production build and deployment

Run the following:

$ docker-compose -f docker-compose.production.yml build
$ docker-compose -f docker-compose.production.yml up angular-seed   # Wait until this container has finished building, as the nginx container is dependent on the production build artifacts
$ docker-compose -f docker-compose.production.yml up -d angular-seed-nginx  # Start the nginx container in detached mode

Now open your browser at http://localhost:5555

Contributing

Please see the CONTRIBUTING file for guidelines.

Awesome Contributors

<img alt="mgechev" src="https://avatars1.githubusercontent.com/u/455023?v=4&s=117" width="117"><img alt="NathanWalker" src="https://avatars2.githubusercontent.com/u/457187?v=4&s=117" width="117"><img alt="ludohenin" src="https://avatars0.githubusercontent.com/u/1011516?v=4&s=117" width="117"><img alt="d3viant0ne" src="https://avatars1.githubusercontent.com/u/8420490?v=4&s=117" width="117"><img alt="Shyam-Chen" src="https://avatars1.githubusercontent.com/u/13535256?v=4&s=117" width="117"><img alt="Nightapes" src="https://avatars1.githubusercontent.com/u/15911153?v=4&s=117" width="117">
mgechevNathanWalkerludohenind3viant0neShyam-ChenNightapes
<img alt="tarlepp" src="https://avatars2.githubusercontent.com/u/595561?v=4&s=117" width="117"><img alt="karlhaas" src="https://avatars2.githubusercontent.com/u/7677394?v=4&s=117" width="117"><img alt="m-abs" src="https://avatars3.githubusercontent.com/u/1348705?v=4&s=117" width="117"><img alt="robstoll" src="https://avatars1.githubusercontent.com/u/5557885?v=4&s=117" width="117"><img alt="TheDonDope" src="https://avatars2.githubusercontent.com/u/1188033?v=4&s=117" width="117"><img alt="nareshbhatia" src="https://avatars1.githubusercontent.com/u/1220198?v=4&s=117" width="117">
tarleppkarlhaasm-absrobstollTheDonDopenareshbhatia
<img alt="hank-ehly" src="https://avatars3.githubusercontent.com/u/11639738?v=4&s=117" width="117"><img alt="kiuka" src="https://avatars1.githubusercontent.com/u/11283191?v=4&s=117" width="117"><img alt="vyakymenko" src="https://avatars1.githubusercontent.com/u/7300673?v=4&s=117" width="117"><img alt="jesperronn" src="https://avatars2.githubusercontent.com/u/6267?v=4&s=117" width="117"><img alt="daniru" src="https://avatars3.githubusercontent.com/u/2070853?v=4&s=117" width="117"><img alt="aboeglin" src="https://avatars0.githubusercontent.com/u/8297302?v=4&s=117" width="117">
hank-ehlykiukavyakymenkojesperronndaniruaboeglin
<img alt="nulldev07" src="https://avatars0.githubusercontent.com/u/2115712?v=4&s=117" width="117"><img alt="eppsilon" src="https://avatars1.githubusercontent.com/u/5643?v=4&s=117" width="117"><img alt="netstart" src="https://avatars1.githubusercontent.com/u/200232?v=4&s=117" width="117"><img alt="sasikumardr" src="https://avatars0.githubusercontent.com/u/1760104?v=4&s=117" width="117"><img alt="gkalpak" src="https://avatars2.githubusercontent.com/u/8604205?v=4&s=117" width="117"><img alt="sfabriece" src="https://avatars2.githubusercontent.com/u/3108592?v=4&s=117" width="117">
nulldev07eppsilonnetstartsasikumardrgkalpaksfabriece
<img alt="JakePartusch" src="https://avatars0.githubusercontent.com/u/6424140?v=4&s=117" width="117"><img alt="ryzy" src="https://avatars1.githubusercontent.com/u/994940?v=4&s=117" width="117"><img alt="markwhitfeld" src="https://avatars0.githubusercontent.com/u/1948265?v=4&s=117" width="117"><img alt="jvitor83" src="https://avatars2.githubusercontent.com/u/3493339?v=4&s=117" width="117"><img alt="fulls1z3" src="https://avatars0.githubusercontent.com/u/19705684?v=4&s=117" width="117"><img alt="ivannugo" src="https://avatars1.githubusercontent.com/u/8823899?v=4&s=117" width="117">
JakePartuschryzymarkwhitfeldjvitor83fulls1z3ivannugo
<img alt="pgrzeszczak" src="https://avatars0.githubusercontent.com/u/3300099?v=4&s=117" width="117"><img alt="treyrich" src="https://avatars0.githubusercontent.com/u/1641028?v=4&s=117" width="117"><img alt="natarajanmca11" src="https://avatars2.githubusercontent.com/u/9244766?v=4&s=117" width="117"><img alt="e-oz" src="https://avatars0.githubusercontent.com/u/526352?v=4&s=117" width="117"><img alt="Kaffiend" src="https://avatars2.githubusercontent.com/u/7826229?v=4&s=117" width="117"><img alt="nosachamos" src="https://avatars1.githubusercontent.com/u/1261686?v=4&s=117" width="117">
pgrzeszczaktreyrichnatarajanmca11e-ozKaffiendnosachamos
<img alt="jerryorta-dev" src="https://avatars1.githubusercontent.com/u/341155?v=4&s=117" width="117"><img alt="alllx" src="https://avatars1.githubusercontent.com/u/701295?v=4&s=117" width="117"><img alt="LuxDie" src="https://avatars2.githubusercontent.com/u/12536671?v=4&s=117" width="117"><img alt="JayKan" src="https://avatars0.githubusercontent.com/u/1400300?v=4&s=117" width="117"><img alt="JohnCashmore" src="https://avatars3.githubusercontent.com/u/2050794?v=4&s=117" width="117"><img alt="larsthorup" src="https://avatars2.githubusercontent.com/u/1202959?v=4&s=117" width="117">
jerryorta-devalllxLuxDieJayKanJohnCashmorelarsthorup
<img alt="ouq77" src="https://avatars2.githubusercontent.com/u/1796191?v=4&s=117" width="117"><img alt="admosity" src="https://avatars2.githubusercontent.com/u/4655972?v=4&s=117" width="117"><img alt="Karasuni" src="https://avatars1.githubusercontent.com/u/15806406?v=4&s=117" width="117"><img alt="irsick" src="https://avatars0.githubusercontent.com/u/1380457?v=4&s=117" width="117"><img alt="StefanKoenen" src="https://avatars3.githubusercontent.com/u/1442819?v=4&s=117" width="117"><img alt="llwt" src="https://avatars0.githubusercontent.com/u/1036428?v=4&s=117" width="117">
ouq77admosityKarasuniirsickStefanKoenenllwt
<img alt="amedinavalencia" src="https://avatars0.githubusercontent.com/u/21317797?v=4&s=117" width="117"><img alt="odk211" src="https://avatars3.githubusercontent.com/u/1321120?v=4&s=117" width="117"><img alt="troyanskiy" src="https://avatars1.githubusercontent.com/u/1538862?v=4&s=117" width="117"><img alt="tsm91" src="https://avatars3.githubusercontent.com/u/4459551?v=4&s=117" width="117"><img alt="hellofornow" src="https://avatars3.githubusercontent.com/u/3720413?v=4&s=117" width="117"><img alt="domfarolino" src="https://avatars1.githubusercontent.com/u/9669289?v=4&s=117" width="117">
amedinavalenciaodk211troyanskiytsm91hellofornowdomfarolino
<img alt="VladimirMakaev" src="https://avatars3.githubusercontent.com/u/2001475?v=4&s=117" width="117"><img alt="juristr" src="https://avatars3.githubusercontent.com/u/542458?v=4&s=117" width="117"><img alt="730alchemy" src="https://avatars2.githubusercontent.com/u/18095359?v=4&s=117" width="117"><img alt="turbohappy" src="https://avatars1.githubusercontent.com/u/437299?v=4&s=117" width="117"><img alt="devanp92" src="https://avatars2.githubusercontent.com/u/4533277?v=4&s=117" width="117"><img alt="DmitriyPotapov" src="https://avatars0.githubusercontent.com/u/5184083?v=4&s=117" width="117">
VladimirMakaevjuristr730alchemyturbohappydevanp92DmitriyPotapov
<img alt="evanplaice" src="https://avatars1.githubusercontent.com/u/303159?v=4&s=117" width="117"><img alt="JunaidZA" src="https://avatars3.githubusercontent.com/u/16782593?v=4&s=117" width="117"><img alt="c-ice" src="https://avatars3.githubusercontent.com/u/347238?v=4&s=117" width="117"><img alt="markharding" src="https://avatars3.githubusercontent.com/u/851436?v=4&s=117" width="117"><img alt="ojacquemart" src="https://avatars1.githubusercontent.com/u/1189345?v=4&s=117" width="117"><img alt="patrickmichalina" src="https://avatars3.githubusercontent.com/u/6701211?v=4&s=117" width="117">
evanplaiceJunaidZAc-icemarkhardingojacquemartpatrickmichalina
<img alt="rajeev-tripathi" src="https://avatars3.githubusercontent.com/u/12512503?v=4&s=117" width="117"><img alt="sanderbos1402" src="https://avatars2.githubusercontent.com/u/7476607?v=4&s=117" width="117"><img alt="Sn3b" src="https://avatars0.githubusercontent.com/u/1598065?v=4&s=117" width="117"><img alt="TuiKiken" src="https://avatars1.githubusercontent.com/u/959821?v=4&s=117" width="117"><img alt="gotenxds" src="https://avatars2.githubusercontent.com/u/3519520?v=4&s=117" width="117"><img alt="divramod" src="https://avatars0.githubusercontent.com/u/1331662?v=4&s=117" width="117">
rajeev-tripathisanderbos1402Sn3bTuiKikengotenxdsdivramod
<img alt="edud69" src="https://avatars2.githubusercontent.com/u/1514745?v=4&s=117" width="117"><img alt="idready" src="https://avatars1.githubusercontent.com/u/4941311?v=4&s=117" width="117"><img alt="kbrandwijk" src="https://avatars1.githubusercontent.com/u/852069?v=4&s=117" width="117"><img alt="Yonet" src="https://avatars1.githubusercontent.com/u/3523671?v=4&s=117" width="117"><img alt="smac89" src="https://avatars3.githubusercontent.com/u/8305511?v=4&s=117" width="117"><img alt="Green-Cat" src="https://avatars2.githubusercontent.com/u/3328823?v=4&s=117" width="117">
edud69idreadykbrandwijkYonetsmac89Green-Cat
<img alt="ip512" src="https://avatars0.githubusercontent.com/u/1699735?v=4&s=117" width="117"><img alt="joshboley" src="https://avatars0.githubusercontent.com/u/5840836?v=4&s=117" width="117"><img alt="Marcelh1983" src="https://avatars1.githubusercontent.com/u/3284645?v=4&s=117" width="117"><img alt="Bigous" src="https://avatars1.githubusercontent.com/u/6886560?v=4&s=117" width="117"><img alt="robbatt" src="https://avatars2.githubusercontent.com/u/1379424?v=4&s=117" width="117"><img alt="yavin5" src="https://avatars1.githubusercontent.com/u/17790782?v=4&s=117" width="117">
ip512joshboleyMarcelh1983Bigousrobbattyavin5
<img alt="alexweber" src="https://avatars1.githubusercontent.com/u/14409?v=4&s=117" width="117"><img alt="vakrilov" src="https://avatars3.githubusercontent.com/u/4092076?v=4&s=117" width="117"><img alt="allenhwkim" src="https://avatars1.githubusercontent.com/u/1437734?v=4&s=117" width="117"><img alt="Falinor" src="https://avatars2.githubusercontent.com/u/9626158?v=4&s=117" width="117"><img alt="amaltsev" src="https://avatars2.githubusercontent.com/u/2480962?v=4&s=117" width="117"><img alt="yassirh" src="https://avatars2.githubusercontent.com/u/4649139?v=4&s=117" width="117">
alexwebervakrilovallenhwkimFalinoramaltsevyassirh
<img alt="bbarry" src="https://avatars0.githubusercontent.com/u/84951?v=4&s=117" width="117"><img alt="urmaul" src="https://avatars2.githubusercontent.com/u/1838544?v=4&s=117" width="117"><img alt="sonicparke" src="https://avatars2.githubusercontent.com/u/1139721?v=4&s=117" width="117"><img alt="brendanbenson" src="https://avatars0.githubusercontent.com/u/866866?v=4&s=117" width="117"><img alt="brian428" src="https://avatars3.githubusercontent.com/u/140338?v=4&s=117" width="117"><img alt="briantopping" src="https://avatars2.githubusercontent.com/u/158115?v=4&s=117" width="117">
bbarryurmaulsonicparkebrendanbensonbrian428briantopping
<img alt="ckapilla" src="https://avatars3.githubusercontent.com/u/451875?v=4&s=117" width="117"><img alt="cadriel" src="https://avatars2.githubusercontent.com/u/205520?v=4&s=117" width="117"><img alt="Cselt" src="https://avatars0.githubusercontent.com/u/11027521?v=4&s=117" width="117"><img alt="dszymczuk" src="https://avatars3.githubusercontent.com/u/539352?v=4&s=117" width="117"><img alt="dmurat" src="https://avatars1.githubusercontent.com/u/470930?v=4&s=117" width="117"><img alt="peah90" src="https://avatars0.githubusercontent.com/u/4435255?v=4&s=117" width="117">
ckapillacadrielCseltdszymczukdmuratpeah90
<img alt="dstockhammer" src="https://avatars1.githubusercontent.com/u/1156637?v=4&s=117" width="117"><img alt="dwido" src="https://avatars3.githubusercontent.com/u/154235?v=4&s=117" width="117"><img alt="dcsw" src="https://avatars2.githubusercontent.com/u/5479057?v=4&s=117" width="117"><img alt="totev" src="https://avatars3.githubusercontent.com/u/4454638?v=4&s=117" width="117"><img alt="EddyVerbruggen" src="https://avatars1.githubusercontent.com/u/1426370?v=4&s=117" width="117"><img alt="ericdoerheit" src="https://avatars1.githubusercontent.com/u/8611720?v=4&s=117" width="117">
dstockhammerdwidodcswtotevEddyVerbruggenericdoerheit
<img alt="ericli1018" src="https://avatars2.githubusercontent.com/u/8234413?v=4&s=117" width="117"><img alt="Swiftwork" src="https://avatars3.githubusercontent.com/u/455178?v=4&s=117" width="117"><img alt="fbascheper" src="https://avatars0.githubusercontent.com/u/430938?v=4&s=117" width="117"><img alt="gsamokovarov" src="https://avatars0.githubusercontent.com/u/604618?v=4&s=117" width="117"><img alt="koodikindral" src="https://avatars3.githubusercontent.com/u/6285484?v=4&s=117" width="117"><img alt="hpinsley" src="https://avatars0.githubusercontent.com/u/750098?v=4&s=117" width="117">
ericli1018Swiftworkfbaschepergsamokovarovkoodikindralhpinsley
<img alt="NN77" src="https://avatars2.githubusercontent.com/u/3319904?v=4&s=117" width="117"><img alt="isidroamv" src="https://avatars0.githubusercontent.com/u/4197621?v=4&s=117" width="117"><img alt="JohnnyQQQQ" src="https://avatars0.githubusercontent.com/u/3528218?v=4&s=117" width="117"><img alt="jeffbcross" src="https://avatars2.githubusercontent.com/u/463703?v=4&s=117" width="117"><img alt="jlooper" src="https://avatars2.githubusercontent.com/u/1450004?v=4&s=117" width="117"><img alt="Jimmysh" src="https://avatars2.githubusercontent.com/u/230652?v=4&s=117" width="117">
NN77isidroamvJohnnyQQQQjeffbcrossjlooperJimmysh
<img alt="Drane" src="https://avatars1.githubusercontent.com/u/389499?v=4&s=117" width="117"><img alt="johnjelinek" src="https://avatars2.githubusercontent.com/u/873610?v=4&s=117" width="117"><img alt="fourctv" src="https://avatars2.githubusercontent.com/u/15777910?v=4&s=117" width="117"><img alt="JunusErgin" src="https://avatars1.githubusercontent.com/u/7281463?v=4&s=117" width="117"><img alt="justindujardin" src="https://avatars0.githubusercontent.com/u/101493?v=4&s=117" width="117"><img alt="karlhiramoto" src="https://avatars2.githubusercontent.com/u/22713?v=4&s=117" width="117">
DranejohnjelinekfourctvJunusErginjustindujardinkarlhiramoto
<img alt="lihaibh" src="https://avatars3.githubusercontent.com/u/4681233?v=4&s=117" width="117"><img alt="Brooooooklyn" src="https://avatars1.githubusercontent.com/u/3468483?v=4&s=117" width="117"><img alt="tandu" src="https://avatars0.githubusercontent.com/u/273313?v=4&s=117" width="117"><img alt="inkidotcom" src="https://avatars3.githubusercontent.com/u/100466?v=4&s=117" width="117"><img alt="mpetkov" src="https://avatars1.githubusercontent.com/u/8858458?v=4&s=117" width="117"><img alt="daixtrose" src="https://avatars2.githubusercontent.com/u/5588692?v=4&s=117" width="117">
lihaibhBrooooooklyntanduinkidotcommpetkovdaixtrose
<img alt="Doehl" src="https://avatars0.githubusercontent.com/u/1913751?v=4&s=117" width="117"><img alt="MathijsHoogland" src="https://avatars2.githubusercontent.com/u/7372934?v=4&s=117" width="117"><img alt="mjwwit" src="https://avatars3.githubusercontent.com/u/4455124?v=4&s=117" width="117"><img alt="oferze" src="https://avatars3.githubusercontent.com/u/5157769?v=4&s=117" width="117"><img alt="ocombe" src="https://avatars0.githubusercontent.com/u/265378?v=4&s=117" width="117"><img alt="gdi2290" src="https://avatars3.githubusercontent.com/u/1016365?v=4&s=117" width="117">
DoehlMathijsHooglandmjwwitoferzeocombegdi2290
<img alt="typekpb" src="https://avatars1.githubusercontent.com/u/499820?v=4&s=117" width="117"><img alt="peter-norton" src="https://avatars1.githubusercontent.com/u/5089611?v=4&s=117" width="117"><img alt="pavlovich" src="https://avatars0.githubusercontent.com/u/1209167?v=4&s=117" width="117"><img alt="philipooo" src="https://avatars3.githubusercontent.com/u/1702399?v=4&s=117" width="117"><img alt="pidupuis" src="https://avatars3.githubusercontent.com/u/2828353?v=4&s=117" width="117"><img alt="redian" src="https://avatars2.githubusercontent.com/u/816941?v=4&s=117" width="117">
typekpbpeter-nortonpavlovichphilipooopidupuisredian
<img alt="robertpenner" src="https://avatars0.githubusercontent.com/u/79827?v=4&s=117" width="117"><img alt="Sjiep" src="https://avatars3.githubusercontent.com/u/5003111?v=4&s=117" width="117"><img alt="RoxKilly" src="https://avatars1.githubusercontent.com/u/12346501?v=4&s=117" width="117"><img alt="siovene" src="https://avatars0.githubusercontent.com/u/891580?v=4&s=117" width="117"><img alt="SamVerschueren" src="https://avatars2.githubusercontent.com/u/1913805?v=4&s=117" width="117"><img alt="sclausen" src="https://avatars1.githubusercontent.com/u/916076?v=4&s=117" width="117">
robertpennerSjiepRoxKillysioveneSamVerschuerensclausen
<img alt="heavymery" src="https://avatars1.githubusercontent.com/u/3417123?v=4&s=117" width="117"><img alt="tjvantoll" src="https://avatars1.githubusercontent.com/u/544280?v=4&s=117" width="117"><img alt="tapas4java" src="https://avatars0.githubusercontent.com/u/2254963?v=4&s=117" width="117"><img alt="gitter-badger" src="https://avatars2.githubusercontent.com/u/8518239?v=4&s=117" width="117"><img alt="tsvetomir" src="https://avatars1.githubusercontent.com/u/247917?v=4&s=117" width="117"><img alt="valera-rozuvan" src="https://avatars1.githubusercontent.com/u/2273090?v=4&s=117" width="117">
heavymerytjvantolltapas4javagitter-badgertsvetomirvalera-rozuvan
<img alt="vogloblinsky" src="https://avatars3.githubusercontent.com/u/2841805?v=4&s=117" width="117"><img alt="vincentpalita" src="https://avatars3.githubusercontent.com/u/2738822?v=4&s=117" width="117"><img alt="ghys" src="https://avatars2.githubusercontent.com/u/2004147?v=4&s=117" width="117"><img alt="Yalrafih" src="https://avatars1.githubusercontent.com/u/7460011?v=4&s=117" width="117"><img alt="arioth" src="https://avatars3.githubusercontent.com/u/3458082?v=4&s=117" width="117"><img alt="arnaudvalle" src="https://avatars2.githubusercontent.com/u/1215056?v=4&s=117" width="117">
vogloblinskyvincentpalitaghysYalrafihariotharnaudvalle
<img alt="billsworld" src="https://avatars3.githubusercontent.com/u/16911647?v=4&s=117" width="117"><img alt="blackheart01" src="https://avatars1.githubusercontent.com/u/1414277?v=4&s=117" width="117"><img alt="butterfieldcons" src="https://avatars2.githubusercontent.com/u/12204784?v=4&s=117" width="117"><img alt="danielcrisp" src="https://avatars1.githubusercontent.com/u/1104814?v=4&s=117" width="117"><img alt="gforceg" src="https://avatars3.githubusercontent.com/u/14267747?v=4&s=117" width="117"><img alt="guilhebl" src="https://avatars0.githubusercontent.com/u/3451270?v=4&s=117" width="117">
billsworldblackheart01butterfieldconsdanielcrispgforcegguilhebl
<img alt="jgolla" src="https://avatars3.githubusercontent.com/u/1542447?v=4&s=117" width="117"><img alt="omerfarukyilmaz" src="https://avatars3.githubusercontent.com/u/5538485?v=4&s=117" width="117"><img alt="pbazurin-softheme" src="https://avatars3.githubusercontent.com/u/4518922?v=4&s=117" width="117"><img alt="ZuSe" src="https://avatars3.githubusercontent.com/u/522403?v=4&s=117" width="117"><img alt="rossedfort" src="https://avatars3.githubusercontent.com/u/11775628?v=4&s=117" width="117"><img alt="ruffiem" src="https://avatars1.githubusercontent.com/u/1785492?v=4&s=117" width="117">
jgollaomerfarukyilmazpbazurin-softhemeZuSerossedfortruffiem
<img alt="savcha" src="https://avatars0.githubusercontent.com/u/879542?v=4&s=117" width="117"><img alt="s-f-a-g" src="https://avatars2.githubusercontent.com/u/6400825?v=4&s=117" width="117"><img alt="ultrasonicsoft" src="https://avatars3.githubusercontent.com/u/4145169?v=4&s=117" width="117"><img alt="taguan" src="https://avatars3.githubusercontent.com/u/1026937?v=4&s=117" width="117">
savchas-f-a-gultrasonicsofttaguan

License

MIT