Git Product home page Git Product logo

steamauth's Introduction

SteamAuth for NodeJS

Implementation of mobile SteamGuard 2FA codes and trading confirmations.

Installation

Expand latest SteamAuth-X.X.X.zip into your project folder.

Usage

Authenticator codes

Add require.

var SteamAuth = require("steamauth"); // if using npm registry

var SteamAuth = require("./SteamAuth"); // if using zip file installation

In normal cases, a time-sync must be done either for SteamAuth or individual SteamAuth instances. This sets the drift between the host computer and Steam servers needed to calculate the correct code.

// Perform an initial time sync
SteamAuth.Sync(function(err)
{
	// we can now create instances
});

Time syncing can also be done on a per-instance basis, by event or callback.

// create a single instance with ready event
var auth = new SteamAuth("KNUGC4TFMRJWKY3SMV2A====");
auth.once("ready", function()
{
	// auth can now be used
});

// create a single instance with callback
var auth = new SteamAuth("KNUGC4TFMRJWKY3SMV2A====", function(err)
{
	// auth can now be used
});

Creating SteamAuth instances can be done with a Base32 string or object with shared_secret.

// simple example with a Base32 code (from WinAuth)
var auth = new SteamAuth("KNUGC4TFMRJWKY3SMV2A====");
var code = auth.calculateCode();

// example with options loaded from Android Steam mobile app
var auth = new SteamAuth({
	shared_secret:"U2hhcmVkU2VjcmV0"
});
var code = auth.calculateCode();

// calculate a code for a specific time (in ms)
var code = auth.calculateCode({time:1449690657000);

If you already have the correct time, you can just jump in and create codes.

// create an authenticator with no time sync
var auth = new SteamAuth({
	shared_secret: "U2hhcmVkU2VjcmV0",
	sync: false
});
// create code for specific time
var code = auth.calculateCode({time:1449690657000});

// quickly create a code for a known secret and time
var code = SteamAuth.calculateCode("KRUGS42JONGXSQ3PMVLTGRLH", 1449690657000);

Trade Confirmations

Trade confirmations require a login to the SteamAuth instance. In this case, you must additionally pass in the deviceid and identity_secret from the steam authenticator.

// create instance with options loaded from Android Steam mobile app
var auth = new SteamAuth({
	deviceid:"android:631471e5-00c8-4e9b-b0e9-45b69426cd09",
	shared_secret:"U2hhcmVkU2VjcmV0",
	identity_secret:"SWRlbnRpdHlTZWNyZXQ="
});

You can then login with username and password.

// login the user
auth.login({
	username:"mysteamuser",
	password:"mypassword"
}, function(err, session)
{
});

Login can fail because of network errors, but also invalid password, authcode or a captcha is required. If a captcha is required, err will contain captchaid and captchurl properties. The captcha must be solved and passed back in to a new login.

// login the user with captcha
auth.login({
	username:"mysteamuser",
	password:"mypassword",
	captchid:12345678,
	captchatext:"ABCDEFG"
}, function(err, session)
{
});

On login, you can get an array of the current trade confirmations.

auth.getTradeConfirmations(function(err, trades)
{
	if (err || !trades.length) return;	
	
});

Trades are returned as summary objects containing: id:string, key:string, details:string, traded:string, when:string. The id and key are used to accept or reject.

// to accept a trade
auth.acceptTradeConfirmation(trade.id, trade.key, function(err)
{
	// trade has been accepted
});
	
// to reject a trade
auth.rejectTradeConfirmation(trade.id, trade.key, function(err)
{
	// trade has been rejected
});

Logging

SteamAuth uses bunyan to log activity. You can get the logger instance at SteamAuth.Logger and set the level, e.g.

// change logging to be "debug"
var SteamAuth = require("steamauth");
SteamAuth.Logger.level("debug");

Levels are "error", "warn", "info" and "debug". The default level is "warn".

Debug level logging will include all web request made to the Steam servers.

Tests

npm test

steamauth's People

Contributors

cdmackie avatar winauth avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

steamauth's Issues

WinAuth Decode Backup Code

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v3.5.1.2

hQEMA53DDyNpqwwqAQgAhsGf84UiPDNvKBy8+gMSVGci52//RziXuyrogtM5GH8p
JilyXLTx2qwyoT6//kfYC/+uhiNqItTpDqkAtC8e096ISoyKemoiDBpMoW4d5Otb
NlB1nXIpAZVr19H8QvyJmybJfOxAKrrFX75+u6VjC68j6Nt0ryO42P/r20dShuvy
X5wHDe22vnZllSrokrtaAroA5CVbW3+MKl4okpoMHzQjCFBtRTfdewkAUtnnJUWM
2vtraJ3PwUoXWsjmxidgbSX5XqzUSuBwctExddoRSScy+JcQLC2dlRq1h01DhO4X
lkvXMjY7PukJhNXypVlth81GU0fN2r2BR8cB3U6modLAygEivVz0zdQplI9NnAmw
sFHeeEuEaS7IETHTpdGNzhU+34ltX9RQFp3j77PZwVHhkUlVYDH/7MRi0bfJ728u
eu8NhPXnuUvJMxTBC7IZVgtBZRdIc0cw48mvD8ott172dUy2oF3GihxpJeSqIfkx
PoYB/A4zBJ7Ix1apSYiHAUGL76Xn4v9BwRRnQCexOD7B9kn8+gS8lJtXZwRDFcfp
1Nx8dW+gFTXj+LLyFBY5gNKdrsd+vWo+V4b1gHBLvIvOLhlDNZrMkbGn96+Ezt+e
aUjuvK37KJN0XglLLtnDn3yIih8HKGNu4XGiis73xe8CLXc4G3XwonUwzeN1YUIX
9BVvydMAIIYtkrtU69QC9muzTp6mVXXLN46Dm7z3jFpBEfP523rKDwfF+DG5bOli
1GkZ7NEJmKp4DArIIHNktcIfuk8SNA731SeBRKx3DL9bEIaaAEqTqJ9WwWXdvQx8
mZq8XTkvOuuJUFh/lvMMiRCf3+Sx3pGW206h/AXaHtCSohWE2U40ipOWI3w=
=3PlO
-----END PGP MESSAGE-----

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v3.5.1.2

hQEMA53DDyNpqwwqAQf/T7xyoxwEd8KfBuimHPiYWP/xf+kcrS65s0gdJu9r9r1Q
5mZYUXa7Q99YmMrHB/UY0tsErGruT+/rcV4igZnXrvOrZMpn+JRT5X9HGFwe5OlP
zRaY05X27+wLns/goW68eV6S9IfuUgB22Wnm72L/6UKBR5xMpxEaCqaMlSYYmjmF
sF02GBg0KRl3aj80JRQblMAedERDKV8pvmBbBoSm5k2CQBlBIOrVXiF4OAwQQoDU
Qd2PwqC4Ke5Ko6gZeOciUVAnv+4JtFJpKMjZQ1rG/pK1i7II90ZngIZy3hiaDFwA
94lbNCcAIclpJfZDlGlZ7Di/eEQODv4ndl8o5kSVPNLAvwHqIge7Rq+Fxrwr93Ve
h//LUBBx6GGHPrHWt2or17aUSZgmY+1lnkLVIo5SWzfpMkrQ2Oe0qFq3thNy0CoP
Lcm6ZUy90FrvaltfIag8QXKUmgRy2AgOxf0011Rk6FTsC2u0pNZSlZd15yS5clgD
QVBXGkxiCoMqrx9I2XiqolRL6XZWKvJiorArJyVdOI+74Fclvyy82KUvU60Za+Yf
OT8cNOXdfaA22qChiJHFp82gDXAs9geN6vrN7q2ucz//soNJCvflNiJfFjE+dZQy
g6/E8qwZcN9zAkVRIzLrtWd/HD2n++jfUaGkAztYiWizP+vFktz78ljvIWjNOhjp
ohCNHyyiQXsqwigMXWoNYic+cdlGDKUfKtoQ/ynWDCOtXiBnG5h1/mW/Eb3+9AWd
eGn8CGC2Tlh+q67actdVe6KdRj8J4427xEJ2Gc19hHJ75C9pzGAnMA+/OUu0qLGJ
Mo/0XV85QGn7ETp40GpH1JEu+heVdFTL1uKYAANtBft4
=U9nX
-----END PGP MESSAGE-----

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v3.5.1.2

hQEMA53DDyNpqwwqAQf/T7xyoxwEd8KfBuimHPiYWP/xf+kcrS65s0gdJu9r9r1Q
5mZYUXa7Q99YmMrHB/UY0tsErGruT+/rcV4igZnXrvOrZMpn+JRT5X9HGFwe5OlP
zRaY05X27+wLns/goW68eV6S9IfuUgB22Wnm72L/6UKBR5xMpxEaCqaMlSYYmjmF
sF02GBg0KRl3aj80JRQblMAedERDKV8pvmBbBoSm5k2CQBlBIOrVXiF4OAwQQoDU
Qd2PwqC4Ke5Ko6gZeOciUVAnv+4JtFJpKMjZQ1rG/pK1i7II90ZngIZy3hiaDFwA
94lbNCcAIclpJfZDlGlZ7Di/eEQODv4ndl8o5kSVPNLAvwHqIge7Rq+Fxrwr93Ve
h//LUBBx6GGHPrHWt2or17aUSZgmY+1lnkLVIo5SWzfpMkrQ2Oe0qFq3thNy0CoP
Lcm6ZUy90FrvaltfIag8QXKUmgRy2AgOxf0011Rk6FTsC2u0pNZSlZd15yS5clgD
QVBXGkxiCoMqrx9I2XiqolRL6XZWKvJiorArJyVdOI+74Fclvyy82KUvU60Za+Yf
OT8cNOXdfaA22qChiJHFp82gDXAs9geN6vrN7q2ucz//soNJCvflNiJfFjE+dZQy
g6/E8qwZcN9zAkVRIzLrtWd/HD2n++jfUaGkAztYiWizP+vFktz78ljvIWjNOhjp
ohCNHyyiQXsqwigMXWoNYic+cdlGDKUfKtoQ/ynWDCOtXiBnG5h1/mW/Eb3+9AWd
eGn8CGC2Tlh+q67actdVe6KdRj8J4427xEJ2Gc19hHJ75C9pzGAnMA+/OUu0qLGJ
Mo/0XV85QGn7ETp40GpH1JEu+heVdFTL1uKYAANtBft4
=U9nX
-----END PGP MESSAGE-----

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v3.5.1.2

hQEMA53DDyNpqwwqAQf/T7xyoxwEd8KfBuimHPiYWP/xf+kcrS65s0gdJu9r9r1Q
5mZYUXa7Q99YmMrHB/UY0tsErGruT+/rcV4igZnXrvOrZMpn+JRT5X9HGFwe5OlP
zRaY05X27+wLns/goW68eV6S9IfuUgB22Wnm72L/6UKBR5xMpxEaCqaMlSYYmjmF
sF02GBg0KRl3aj80JRQblMAedERDKV8pvmBbBoSm5k2CQBlBIOrVXiF4OAwQQoDU
Qd2PwqC4Ke5Ko6gZeOciUVAnv+4JtFJpKMjZQ1rG/pK1i7II90ZngIZy3hiaDFwA
94lbNCcAIclpJfZDlGlZ7Di/eEQODv4ndl8o5kSVPNLAvwHqIge7Rq+Fxrwr93Ve
h//LUBBx6GGHPrHWt2or17aUSZgmY+1lnkLVIo5SWzfpMkrQ2Oe0qFq3thNy0CoP
Lcm6ZUy90FrvaltfIag8QXKUmgRy2AgOxf0011Rk6FTsC2u0pNZSlZd15yS5clgD
QVBXGkxiCoMqrx9I2XiqolRL6XZWKvJiorArJyVdOI+74Fclvyy82KUvU60Za+Yf
OT8cNOXdfaA22qChiJHFp82gDXAs9geN6vrN7q2ucz//soNJCvflNiJfFjE+dZQy
g6/E8qwZcN9zAkVRIzLrtWd/HD2n++jfUaGkAztYiWizP+vFktz78ljvIWjNOhjp
ohCNHyyiQXsqwigMXWoNYic+cdlGDKUfKtoQ/ynWDCOtXiBnG5h1/mW/Eb3+9AWd
eGn8CGC2Tlh+q67actdVe6KdRj8J4427xEJ2Gc19hHJ75C9pzGAnMA+/OUu0qLGJ
Mo/0XV85QGn7ETp40GpH1JEu+heVdFTL1uKYAANtBft4
=U9nX
-----END PGP MESSAGE-----

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v3.5.1.2

hQEMA53DDyNpqwwqAQf/T7xyoxwEd8KfBuimHPiYWP/xf+kcrS65s0gdJu9r9r1Q
5mZYUXa7Q99YmMrHB/UY0tsErGruT+/rcV4igZnXrvOrZMpn+JRT5X9HGFwe5OlP
zRaY05X27+wLns/goW68eV6S9IfuUgB22Wnm72L/6UKBR5xMpxEaCqaMlSYYmjmF
sF02GBg0KRl3aj80JRQblMAedERDKV8pvmBbBoSm5k2CQBlBIOrVXiF4OAwQQoDU
Qd2PwqC4Ke5Ko6gZeOciUVAnv+4JtFJpKMjZQ1rG/pK1i7II90ZngIZy3hiaDFwA
94lbNCcAIclpJfZDlGlZ7Di/eEQODv4ndl8o5kSVPNLAvwHqIge7Rq+Fxrwr93Ve
h//LUBBx6GGHPrHWt2or17aUSZgmY+1lnkLVIo5SWzfpMkrQ2Oe0qFq3thNy0CoP
Lcm6ZUy90FrvaltfIag8QXKUmgRy2AgOxf0011Rk6FTsC2u0pNZSlZd15yS5clgD
QVBXGkxiCoMqrx9I2XiqolRL6XZWKvJiorArJyVdOI+74Fclvyy82KUvU60Za+Yf
OT8cNOXdfaA22qChiJHFp82gDXAs9geN6vrN7q2ucz//soNJCvflNiJfFjE+dZQy
g6/E8qwZcN9zAkVRIzLrtWd/HD2n++jfUaGkAztYiWizP+vFktz78ljvIWjNOhjp
ohCNHyyiQXsqwigMXWoNYic+cdlGDKUfKtoQ/ynWDCOtXiBnG5h1/mW/Eb3+9AWd
eGn8CGC2Tlh+q67actdVe6KdRj8J4427xEJ2Gc19hHJ75C9pzGAnMA+/OUu0qLGJ
Mo/0XV85QGn7ETp40GpH1JEu+heVdFTL1uKYAANtBft4
=U9nX
-----END PGP MESSAGE-----

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v3.5.1.2

hQEMA53DDyNpqwwqAQf/T7xyoxwEd8KfBuimHPiYWP/xf+kcrS65s0gdJu9r9r1Q
5mZYUXa7Q99YmMrHB/UY0tsErGruT+/rcV4igZnXrvOrZMpn+JRT5X9HGFwe5OlP
zRaY05X27+wLns/goW68eV6S9IfuUgB22Wnm72L/6UKBR5xMpxEaCqaMlSYYmjmF
sF02GBg0KRl3aj80JRQblMAedERDKV8pvmBbBoSm5k2CQBlBIOrVXiF4OAwQQoDU
Qd2PwqC4Ke5Ko6gZeOciUVAnv+4JtFJpKMjZQ1rG/pK1i7II90ZngIZy3hiaDFwA
94lbNCcAIclpJfZDlGlZ7Di/eEQODv4ndl8o5kSVPNLAvwHqIge7Rq+Fxrwr93Ve
h//LUBBx6GGHPrHWt2or17aUSZgmY+1lnkLVIo5SWzfpMkrQ2Oe0qFq3thNy0CoP
Lcm6ZUy90FrvaltfIag8QXKUmgRy2AgOxf0011Rk6FTsC2u0pNZSlZd15yS5clgD
QVBXGkxiCoMqrx9I2XiqolRL6XZWKvJiorArJyVdOI+74Fclvyy82KUvU60Za+Yf
OT8cNOXdfaA22qChiJHFp82gDXAs9geN6vrN7q2ucz//soNJCvflNiJfFjE+dZQy
g6/E8qwZcN9zAkVRIzLrtWd/HD2n++jfUaGkAztYiWizP+vFktz78ljvIWjNOhjp
ohCNHyyiQXsqwigMXWoNYic+cdlGDKUfKtoQ/ynWDCOtXiBnG5h1/mW/Eb3+9AWd
eGn8CGC2Tlh+q67actdVe6KdRj8J4427xEJ2Gc19hHJ75C9pzGAnMA+/OUu0qLGJ
Mo/0XV85QGn7ETp40GpH1JEu+heVdFTL1uKYAANtBft4
=U9nX
-----END PGP MESSAGE-----

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v3.5.1.2

hQEMA53DDyNpqwwqAQf8DiAQPQv4T+3cORlQwOpIZOPvazjtek6CBbKzvwpmIdze
5QZa+0cPbXtTH1hlTwM5eBTHjWCj96Iz0Z/3N857YOhw4BJLGJPNZJY3qt770Plm
1N0WA7h4T4EdiFoaCGdrmdJLCizyknKEjZmAj3lyeHOzLJf6lwNDW8iEQXbugJTw
EYDYVKCW4P7FxAiljDLIxwB8ZDbSMne+FSP0b8GZsEFN/zHKhQswhRUfjRdqA1j6
x0UaPtnL2DMyrjwI9noYvLYqMIR+fUToobdj8OUEGWsGEmqG+fbm4Xa7pLmwAO+8
H0BIL9cj8+9kWkkzXFElB14kc5hi85Qf5w8KO9IrX9LAygEve4ywigZxTYcs/a3h
IfC7AY7a8ZdktInU+s8T4UNa2T0WbrzL13awALQqOqdHPNZ7Kq8Jsek6ptCa6q5Y
Nzs+33PATyUvZGhQAj7bleC8XDffgSNZ3VuSnQyj7+nx8KaZ38z11LNa/ymuxNUF
odeLnbbtAMLgneqv7YbAao52H+36u8PCn0M32hprIClxtEQdFT+S5GpVNo1+hgvD
zNfvMMehx6k+RDYwDJEtiemt13FxihA0lc6Y/uRPebKWGVuHUJ67yeqYroNg1pfx
5TGir/znTZrlvEOEMjSGcApHGilpuN6UD/tAANgA0DFbS9o1cuvWhmxfBTSTRdUR
RVqNtDhj+CWixQp95YVehxOWOhek5u3Z0N/pT/dtOqjAjQSFWqPJBRJdYUDt2VO3
9imxj/S3nYLq1AiTZoHwSkldO5mkKCwevApiQNTeF7gi6RZsUT7QlWkCGpxAixSS
Tu6d1QZh3xlhLA+0mMmVDvVqT9djfaO9pfGC3yyO+4bPaaXwvPklAi9nKww=
=eKkq
-----END PGP MESSAGE-----

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v3.5.1.2

hQEMA53DDyNpqwwqAQf/YoQFbeFZKTA+i6LYM6uqLDxVxIFi7ebdc32keT+bh1YD
+r7yiX6DxEtG6FyJWEdQ5VR7V9bQvoDBpbjvXcAQaWfbkW7uFXgI3gyaA6b2im8o
0+gvzTyWBsOVW6XYwgfolP0SsPv7SlnEFGM4uR2Qtq6Nl1KAGG4tr2KPkqeqBo6Y
ulm500A9Vanl8KlmwXa/11IAjuP9eYEMClwb5OIHutKxp1MmeLPckziapPxqB1BE
0cY6O9ecvhxP7bkQtysYk/RIahABUZWdcLrfSXIgzcfMXZC8Y7wqpHvP5iMfD9Rp
InIquujr31NY5eR71n5LJAdSy6bE/t9M25dX3ILvrdLAwAES6VLBZDm3iTVGlSQs
s9Q12SGa11rX/IY46NaUXM76bAFkb6UgdfaXi5OxK7pMG/Qmlpl6A4NTmrefVt4E
2c9kQXV65EmWs1CUKacsatGZtxHYri3GLxWQWUk2lFTI9AVcvumNadOJWSpzM05Q
fp1H0RaQ/um6DBEaK1c2ofCg0rb0UO4pPugKYzpNFhnpBe8X8hz7utHZ2GCbP6Mc
qsNUaKr/NIR+ibJ1z38SiNkxG7SjCGtiPdmHQCiIbHEKfgrECYkjGus0URfApNth
Xy1viCBOmT4Qf9zTNnvIu0EDlWPPAufZQNbsO2e5HUmhRy8Sr78u0tvCzTAJIlps
ua7i/m+yRETGSrQg9twq0Yyjib/v9vXb6HT7MxhlByLIX7KMYvTFj0LrDT5L+HPq
52CLdtp82YxEIa1QSRWMSBUIvfmmmlU0/TkPZpvmChFIvzHR93NqyCT6aXFwMKd0
AHLXO/gKbPOoecdYhS47kiO5gIoozjvrhGUhUw6gxMR2/Q==
=9sXj
-----END PGP MESSAGE-----

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v3.5.1.2

hQEMA53DDyNpqwwqAQf9GyadAhaIc3z+VbnegeR4Bc1hWt9BQcLNwt4IJucgZJSb
0UNSe5/g/cCGyV2ZGnIdqWhxueP1JdQh2Tqm9kRP+JwevQGL/H9AfBdEMOQciBkw
6hwYo4G9uuQHjwlG2TgQpXCNZrf5j+puyajyaIbqW1M2VxP1hF7V8KO/O6J5HHL3
0wVUCutEJnfMuPlj40YjDg3Gxog4zBJEIxBxrXQsNv5OOxFvdtCna1fuCiiGjmZr
iPkBujSE3xTjYolBwI3Bi889JtzUSVgSNqKHMQmWPE9MgatHkRkMjolXoiHZ7d2m
o76DKyYM6QJcqVfoYGxPIsm6v2B2UG8JXq2LCKcbqdLAzwGlAoI2Hz2Oze4cikGr
p5GO3OaCxMynw7DmLoTr3p35CVtsIcwX5z1kaSG6Z6CzdZvTh5y15cthlYrEoeN2
G94dc2U2Abo3x56iDBIrvbmuLuHQTVxkJzIX22Mg0ntno+mfjfsZFJbQehdPv3Jr
PlbLrWj4AHi1ofS7HjxISNk07Z3XAs8k4yNjOz5Xfe9PuVwqWeQdDlFeCMI7y5JR
8CcpSX9JUBk//FTZuPfBKXA2NgIytGvdSun8VmNAX8yX37/LgxhkzmVdPIRKHXyI
7RLd8376LMhb1pF1iDag/eyFKK89pc+2dGVt+zdMLGD0zNcWX4rJC1Pvwpl9t5Kb
PPaXzU0cf8MqV9VY/NZs2ClUqwuMlf36oi90qJ50yIyyThrzJtRrmDdrrrNF9kz8
EAby12sCcWcH0wELdxz16h019c8mU74hg5FFJuoqPG2DBNyepLfURZITn0QKAbsu
2YKzIqfjdghvy0u/BC8bub6bwKN5tYiEu6m3ykmvpd/yBOVq+87qH9oPooU/PNEg
RQ==
=gK7J
-----END PGP MESSAGE-----

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v3.5.1.2

hQEMA53DDyNpqwwqAQf/SGjjZZuaZs/t2nJtKWYrCd7Jtu9zB9kaMg+rddZo8jIE
ZADXgKGk/rFd6So2w0rdfO8VLTA6GItR7F3L3CyG97AsHB+Ioozr+nTK/izdznqa
1Jfq7Kqf5IkVwBxgS8FTAnplKfMvV4opah4kn0dv2dq33edwP40OI83pE2TSfCS8
bvh8qpoIqE5XnsOF3p3MHKytKDFjV+7Kx+UfsvbSLR40t2ybR5bbXR+sER7w0Oua
VnAc9nvT7Mph01AfWzko/ft0EPMWSt72OiDNJjz228JhY3IzoKCkWaBetamUO4dm
DJiNZWExTaFTtm01KQzpA/cKT7NtSQ745+GoKJwqodLAyAHAvGLvR8+YRNRb4yUx
ntdueFnVPyNAbwQ/eo9wT9prWAx0xWEfAr5eTAwe1ct4+UIBbYkSpoKIxFyWgyZk
WT3Ef+QMpHAILVkB97dyhI7I2ApnBlRJo5gKSSfSVmtr+Kp78F35t50i+n5bRGYZ
PmAw9KJSIrFNNEamkJwf+quOFOXKqhRXLILdHByiwP/2NSvQXKKm48W9UUUn/dwN
WLBsSXkxst2/n19lZ0Y6H4XvAD7HZ1f3ItFYbaopO8eDkmxIKAH3rnkjcvqGm5F0
bnDH/Cx0pGDQj5kwdoyvdE8QIV1uKBjkVXQfVAQsgSxEMJyikcKaXAgOulDTHquE
gUFKEnMqEX5gcTor/EaGED1ntG1zcIWpGUqKHNF8JoiFl+EqehmhmqutKNrc1d/Q
P4YLsoZ6RFOtecB72u3+9jYtCXNp8Kgk0s38vqumFYvEqA60MDFmewhMKs95dZ6i
dgzuVxYYxAncNQ70wYX74yqXzVFjBfrnb8SCYhdLNbmuGgzCZ+CUXZJ6
=SsPL
-----END PGP MESSAGE-----

please contact me via email: [email protected] (i am also rdy to pay of course)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.