dns2 2.0.0 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/client/doh.js CHANGED
@@ -1,42 +1,50 @@
1
- const https = require('https');
2
- const Packet = require('../packet');
3
-
4
- const get = url => new Promise(resolve => {
5
- const headers = {
6
- accept: 'application/dns-message'
7
- };
8
- https.get(url, { headers }, resolve);
9
- });
10
-
11
- const readStream = stream => {
12
- const buffer = [];
13
- return new Promise((resolve, reject) => {
14
- stream
15
- .on('error', reject)
16
- .on('data', chunk => buffer.push(chunk))
17
- .on('end', () => resolve(Buffer.concat(buffer)));
18
- })
19
- };
20
-
21
- /**
22
- * @docs https://tools.ietf.org/html/rfc8484
23
- * @param {*} param0
24
- */
25
- const DOHClient = ({ dns } = {}) => {
26
- return (name, type = 'A', cls = Packet.CLASS.IN) => {
27
- const packet = new Packet();
28
- packet.questions.push({
29
- name,
30
- class: cls,
31
- type: Packet.TYPE[type],
32
- });
33
- const query = packet.toBase64URL();
34
- return Promise
35
- .resolve()
36
- .then(() => get(`https://${dns}/dns-query?dns=${query}`))
37
- .then(readStream)
38
- .then(Packet.parse)
39
- };
40
- };
41
-
42
- module.exports = DOHClient;
1
+ const Packet = require('../packet');
2
+
3
+ const defaultGet = url => new Promise((resolve, reject) => {
4
+ const headers = {
5
+ accept: 'application/dns-message',
6
+ };
7
+ const base = url.startsWith('https') ? require('https') : require('http');
8
+ const req = base.get(url, { headers }, resolve);
9
+ req.on('error', reject);
10
+ });
11
+
12
+ const readStream = stream => {
13
+ const buffer = [];
14
+ return new Promise((resolve, reject) => {
15
+ stream
16
+ .on('error', reject)
17
+ .on('data', chunk => buffer.push(chunk))
18
+ .on('end', () => resolve(Buffer.concat(buffer)));
19
+ });
20
+ };
21
+
22
+ /**
23
+ * @docs https://tools.ietf.org/html/rfc8484
24
+ * @param {*} param0
25
+ */
26
+ const DOHClient = ({ dns, http, get = defaultGet } = {}) => {
27
+ return (name, type = 'A', cls = Packet.CLASS.IN, { clientIp, recursive = true } = {}) => {
28
+ const packet = new Packet();
29
+ // see https://github.com/song940/node-dns/issues/29
30
+ if (recursive) {
31
+ packet.header.rd = 1;
32
+ }
33
+ if (clientIp) {
34
+ packet.additionals.push(Packet.Resource.EDNS([
35
+ Packet.Resource.EDNS.ECS(clientIp),
36
+ ]));
37
+ }
38
+ packet.questions.push({
39
+ name,
40
+ class : cls,
41
+ type : Packet.TYPE[type],
42
+ });
43
+ const query = packet.toBase64URL();
44
+ return Promise.resolve(get(`http${http ? '' : 's'}://${dns}/dns-query?dns=${query}`))
45
+ .then(readStream)
46
+ .then(Packet.parse);
47
+ };
48
+ };
49
+
50
+ module.exports = DOHClient;
package/client/google.js CHANGED
@@ -1,27 +1,27 @@
1
- const https = require('https');
2
-
3
- const get = url => new Promise(resolve =>
4
- https.get(url, resolve));
5
-
6
- const readStream = stream => {
7
- const buffer = [];
8
- return new Promise((resolve, reject) => {
9
- stream
10
- .on('error', reject)
11
- .on('data', chunk => {
12
- buffer.push(chunk)
13
- })
14
- .on('end', () => resolve(Buffer.concat(buffer)));
15
- });
16
- };
17
-
18
- const GoogleClient = ({ }) =>
19
- (name, type = 'ANY') => {
20
- return Promise
21
- .resolve()
22
- .then(() => get(`https://dns.google.com/resolve?name=${name}&type=${type}`))
23
- .then(readStream)
24
- .then(JSON.parse)
25
- };
26
-
27
- module.exports = GoogleClient;
1
+ const https = require('https');
2
+
3
+ const get = url => new Promise(resolve =>
4
+ https.get(url, resolve));
5
+
6
+ const readStream = stream => {
7
+ const buffer = [];
8
+ return new Promise((resolve, reject) => {
9
+ stream
10
+ .on('error', reject)
11
+ .on('data', chunk => {
12
+ buffer.push(chunk);
13
+ })
14
+ .on('end', () => resolve(Buffer.concat(buffer)));
15
+ });
16
+ };
17
+
18
+ const GoogleClient = () =>
19
+ (name, type = 'ANY') => {
20
+ return Promise
21
+ .resolve()
22
+ .then(() => get(`https://dns.google.com/resolve?name=${name}&type=${type}`))
23
+ .then(readStream)
24
+ .then(JSON.parse);
25
+ };
26
+
27
+ module.exports = GoogleClient;
package/client/tcp.js CHANGED
@@ -1,34 +1,34 @@
1
- const tcp = require('net');
2
- const Packet = require('../packet');
3
-
4
- module.exports = ({ dns = '1.1.1.1', port = 53 } = {}) => {
5
- return async (name, type = 'A', cls = Packet.CLASS.IN, { clientIp, recursive = true } = {}) => {
6
- const packet = new Packet();
7
-
8
- // see https://github.com/song940/node-dns/issues/29
9
- if (recursive) {
10
- query.header.rd = 1;
11
- }
12
- if (clientIp) {
13
- query.additionals.push(Packet.Resource.EDNS([
14
- Packet.Resource.EDNS.ECS(clientIp)
15
- ]));
16
- };
17
-
18
- packet.questions.push({
19
- name,
20
- class: cls,
21
- type: Packet.TYPE[type],
22
- });
23
- const message = packet.toBuffer();
24
- const len = Buffer.alloc(2);
25
- len.writeUInt16BE(message.length);
26
- const client = tcp.connect({ host: dns, port });
27
- client.end(Buffer.concat([len, message]));
28
- const data = await Packet.readStream(client);
29
- if (!data.length) {
30
- throw new Error('Empty TCP response');
31
- }
32
- return Packet.parse(data);
33
- }
34
- };
1
+ const tcp = require('net');
2
+ const Packet = require('../packet');
3
+
4
+ module.exports = ({ dns = '1.1.1.1', port = 53 } = {}) => {
5
+ return async(name, type = 'A', cls = Packet.CLASS.IN, { clientIp, recursive = true } = {}) => {
6
+ const packet = new Packet();
7
+
8
+ // see https://github.com/song940/node-dns/issues/29
9
+ if (recursive) {
10
+ packet.header.rd = 1;
11
+ }
12
+ if (clientIp) {
13
+ packet.additionals.push(Packet.Resource.EDNS([
14
+ Packet.Resource.EDNS.ECS(clientIp),
15
+ ]));
16
+ }
17
+
18
+ packet.questions.push({
19
+ name,
20
+ class : cls,
21
+ type : Packet.TYPE[type],
22
+ });
23
+ const message = packet.toBuffer();
24
+ const len = Buffer.alloc(2);
25
+ len.writeUInt16BE(message.length);
26
+ const client = tcp.connect({ host: dns, port });
27
+ client.end(Buffer.concat([ len, message ]));
28
+ const data = await Packet.readStream(client);
29
+ if (!data.length) {
30
+ throw new Error('Empty TCP response');
31
+ }
32
+ return Packet.parse(data);
33
+ };
34
+ };
package/client/udp.js CHANGED
@@ -1,39 +1,39 @@
1
- const udp = require('dgram');
2
- const Packet = require('../packet');
3
- const { equal } = require('assert');
4
- const { debuglog } = require('util');
5
-
6
- const debug = debuglog('dns2');
7
-
8
- module.exports = ({ dns = '8.8.8.8', port = 53, socketType = 'udp4' } = {}) => {
9
- return (name, type = 'A', cls = Packet.CLASS.IN, { clientIp, recursive = true } = {}) => {
10
- const query = new Packet();
11
- query.header.id = (Math.random() * 1e4) | 0;
12
-
13
- // see https://github.com/song940/node-dns/issues/29
14
- if (recursive) {
15
- query.header.rd = 1;
16
- }
17
- if (clientIp) {
18
- query.additionals.push(Packet.Resource.EDNS([
19
- Packet.Resource.EDNS.ECS(clientIp)
20
- ]));
21
- };
22
- query.questions.push({
23
- name,
24
- class: cls,
25
- type: Packet.TYPE[type],
26
- });
27
- const client = new udp.Socket(socketType);
28
- return new Promise((resolve, reject) => {
29
- client.once('message', function onMessage(message) {
30
- client.close();
31
- const response = Packet.parse(message);
32
- equal(response.header.id, query.header.id);
33
- resolve(response);
34
- });
35
- debug('send', dns, query.toBuffer());
36
- client.send(query.toBuffer(), port, dns, err => err && reject(err));
37
- });
38
- }
39
- };
1
+ const udp = require('dgram');
2
+ const Packet = require('../packet');
3
+ const { equal } = require('assert');
4
+ const { debuglog } = require('util');
5
+
6
+ const debug = debuglog('dns2');
7
+
8
+ module.exports = ({ dns = '8.8.8.8', port = 53, socketType = 'udp4' } = {}) => {
9
+ return (name, type = 'A', cls = Packet.CLASS.IN, { clientIp, recursive = true } = {}) => {
10
+ const query = new Packet();
11
+ query.header.id = (Math.random() * 1e4) | 0;
12
+
13
+ // see https://github.com/song940/node-dns/issues/29
14
+ if (recursive) {
15
+ query.header.rd = 1;
16
+ }
17
+ if (clientIp) {
18
+ query.additionals.push(Packet.Resource.EDNS([
19
+ Packet.Resource.EDNS.ECS(clientIp),
20
+ ]));
21
+ }
22
+ query.questions.push({
23
+ name,
24
+ class : cls,
25
+ type : Packet.TYPE[type],
26
+ });
27
+ const client = new udp.Socket(socketType);
28
+ return new Promise((resolve, reject) => {
29
+ client.once('message', function onMessage(message) {
30
+ client.close();
31
+ const response = Packet.parse(message);
32
+ equal(response.header.id, query.header.id);
33
+ resolve(response);
34
+ });
35
+ debug('send', dns, query.toBuffer());
36
+ client.send(query.toBuffer(), port, dns, err => err && reject(err));
37
+ });
38
+ };
39
+ };
@@ -1,12 +1,12 @@
1
- const { DOHClient } = require('../..');
2
-
3
- const resolve = DOHClient({
4
- dns: '1.1.1.1'
5
- });
6
-
7
- (async () => {
8
-
9
- const response = await resolve('google.com');
10
- console.log(response.answers);
11
-
12
- })();
1
+ const { DOHClient } = require('../..');
2
+
3
+ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
4
+
5
+ const resolve = DOHClient({
6
+ dns: '1.1.1.1',
7
+ });
8
+
9
+ (async() => {
10
+ const response = await resolve('google.com');
11
+ console.log(response.answers);
12
+ })();
@@ -1,8 +1,7 @@
1
- const { GoogleClient } = require('../..');
2
-
3
- (async () => {
4
- const resolve = GoogleClient();
5
- const response = await resolve('google.com');
6
- console.log(response);
7
-
8
- })();
1
+ const { GoogleClient } = require('../..');
2
+
3
+ (async() => {
4
+ const resolve = GoogleClient();
5
+ const response = await resolve('google.com');
6
+ console.log(response);
7
+ })();
@@ -1,10 +1,10 @@
1
- const { TCPClient } = require('../..');
2
-
3
- const resolve = TCPClient({
4
- dns: '1.1.1.1'
5
- });
6
-
7
- (async () => {
8
- const response = await resolve('google.com')
9
- console.log(response.answers);
10
- })();
1
+ const { TCPClient } = require('../..');
2
+
3
+ const resolve = TCPClient({
4
+ dns: '1.1.1.1',
5
+ });
6
+
7
+ (async() => {
8
+ const response = await resolve('google.com');
9
+ console.log(response.answers);
10
+ })();
@@ -1,12 +1,12 @@
1
- const { TCPClient } = require('../..');
2
-
3
- const resolve = TCPClient();
4
-
5
- (async () => {
6
- try {
7
- const response = await resolve('google.com')
8
- console.log(response.answers);
9
- } catch(error) {
10
- console.log(error);
11
- }
12
- })();
1
+ const { TCPClient } = require('../..');
2
+
3
+ const resolve = TCPClient();
4
+
5
+ (async() => {
6
+ try {
7
+ const response = await resolve('google.com');
8
+ console.log(response.answers);
9
+ } catch (error) {
10
+ console.log(error);
11
+ }
12
+ })();
@@ -1,11 +1,11 @@
1
- const dns = require('dns');
2
- const { UDPClient } = require('../..');
3
-
4
- const resolve = UDPClient({
5
- dns: dns.getServers()[0]
6
- });
7
-
8
- (async () => {
9
- const response = await resolve('google.com')
10
- console.log(response.answers);
11
- })();
1
+ const dns = require('dns');
2
+ const { UDPClient } = require('../..');
3
+
4
+ const resolve = UDPClient({
5
+ dns: dns.getServers()[0],
6
+ });
7
+
8
+ (async() => {
9
+ const response = await resolve('google.com');
10
+ console.log(response.answers);
11
+ })();
@@ -1,8 +1,8 @@
1
- const DNS = require('../..');
2
-
3
- const dns = new DNS();
4
-
5
- (async () => {
6
- const result = await dns.resolveA('google.com');
7
- console.log(result.answers);
8
- })();
1
+ const DNS = require('../..');
2
+
3
+ const dns = new DNS();
4
+
5
+ (async() => {
6
+ const result = await dns.resolveA('google.com');
7
+ console.log(result.answers);
8
+ })();
@@ -1,11 +1,11 @@
1
- const DNS = require('../..');
2
-
3
- // Lookup directly from ns1.google.com
4
- const dns = new DNS({nameServers: ['216.239.32.10']});
5
-
6
- (async () => {
7
- // What is the IP address for google.com if a client in the subnet
8
- // '178.67.222.0/24' asks for it?
9
- const result = await dns.resolveA('google.com', '178.67.222.0/24');
10
- console.log(result.answers);
11
- })();
1
+ const DNS = require('../..');
2
+
3
+ // Lookup directly from ns1.google.com
4
+ const dns = new DNS({ nameServers: [ '216.239.32.10' ] });
5
+
6
+ (async() => {
7
+ // What is the IP address for google.com if a client in the subnet
8
+ // '178.67.222.0/24' asks for it?
9
+ const result = await dns.resolveA('google.com', '178.67.222.0/24');
10
+ console.log(result.answers);
11
+ })();
@@ -1,8 +1,8 @@
1
- const { UDPClient } = require('../..');
2
-
3
- const resolve = UDPClient();
4
-
5
- (async () => {
6
- const response = await resolve('google.com')
7
- console.log(response.answers);
8
- })();
1
+ const { UDPClient } = require('../..');
2
+
3
+ const resolve = UDPClient();
4
+
5
+ (async() => {
6
+ const response = await resolve('google.com');
7
+ console.log(response.answers);
8
+ })();
@@ -0,0 +1,46 @@
1
+ const dns = require('../..');
2
+ const path = require('path');
3
+ const fs = require('fs');
4
+
5
+ const { Packet } = dns;
6
+
7
+ // Create a SSL enabled server
8
+ const server = dns.createServer({
9
+ udp : true,
10
+ tcp : true,
11
+ doh : {
12
+ ssl : true,
13
+ cert : fs.readFileSync(path.join(__dirname, 'server.crt')),
14
+ key : fs.readFileSync(path.join(__dirname, 'secret.key')),
15
+ },
16
+ });
17
+
18
+ // Handle the incomming request (same style as both UDP and TCP server)
19
+ server.on('request', (request, send, client) => {
20
+ const response = Packet.createResponseFromRequest(request);
21
+ const [ question ] = request.questions;
22
+ const { name } = question;
23
+ response.answers.push({
24
+ name,
25
+ type : Packet.TYPE.A,
26
+ class : Packet.CLASS.IN,
27
+ ttl : 300,
28
+ address : '1.1.1.1',
29
+ });
30
+ send(response);
31
+ });
32
+
33
+ (async() => {
34
+ const closed = new Promise(resolve => process.on('SIGINT', resolve));
35
+ await server.listen({
36
+ doh : 8443,
37
+ udp : 5333,
38
+ tcp : 5334,
39
+ });
40
+ console.log('Listening.');
41
+ console.log(server.addresses());
42
+ await closed;
43
+ process.stdout.write('\n');
44
+ await server.close();
45
+ console.log('Closed.');
46
+ })();
@@ -1,28 +1,30 @@
1
- const dns = require('../..');
2
- const path = require('path');
3
- const fs = require('fs');
4
-
5
- const { Packet } = dns;
6
-
7
- // Create a SSL enabled server
8
- const server = dns.createDOHServer({
9
- port: 0,
10
- sslport: 443,
11
- cert: fs.readFileSync(path.join(__dirname,"server.crt")),
12
- key: fs.readFileSync(path.join(__dirname,"secret.key"))
13
- });
14
-
15
- //Handle the incomming request (same style as both UDP and TCP server)
16
- server.on('request', (request, send, client) => {
17
- const response = Packet.createResponseFromRequest(request);
18
- const [ question ] = request.questions;
19
- const { name } = question;
20
- response.answers.push({
21
- name,
22
- type: Packet.TYPE.A,
23
- class: Packet.CLASS.IN,
24
- ttl: 300,
25
- address: '8.8.8.8'
26
- });
27
- send(response);
28
- });
1
+ const dns = require('../..');
2
+ const path = require('path');
3
+ const fs = require('fs');
4
+
5
+ const { Packet } = dns;
6
+
7
+ // Create a SSL enabled server
8
+ const server = dns.createDOHServer({
9
+ port : 8080,
10
+ ssl : true,
11
+ cert : fs.readFileSync(path.join(__dirname, 'server.crt')),
12
+ key : fs.readFileSync(path.join(__dirname, 'secret.key')),
13
+ });
14
+
15
+ // Handle the incomming request (same style as both UDP and TCP server)
16
+ server.on('request', (request, send, client) => {
17
+ const response = Packet.createResponseFromRequest(request);
18
+ const [ question ] = request.questions;
19
+ const { name } = question;
20
+ response.answers.push({
21
+ name,
22
+ type : Packet.TYPE.A,
23
+ class : Packet.CLASS.IN,
24
+ ttl : 300,
25
+ address : '1.1.1.1',
26
+ });
27
+ send(response);
28
+ });
29
+
30
+ server.listen();
@@ -1,28 +1,28 @@
1
- -----BEGIN PRIVATE KEY-----
2
- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDLodEOCR2A593i
3
- wZR7xkHOgHeCK697OXknn4okuUqopUo5qcQeqcvNJ+McMNGexwpg3YuIHKYYGmtw
4
- 1QCoeqCOPoyZUed6GK5r7CkQl+hsCMrbRFpM8B8RmlsxVoot52WyfhF0lJT087g9
5
- L4P1/rwcE6NGMkpvpCl/3mo90AYvFyX+LWpBFi4j3hx33LoTiuMunhOROWNobG1Z
6
- GWYsoQriCq6mO9SOk1sbKXnr27yMaxbHcjZO36ZJxobrkHManVtmAQIlW0j66MLj
7
- 6xsa9AZep0zFVQnoRZA56GYyH81RNAdxps1Nr7GYgRi4kyDLGvo2ZTJUuxpbiR68
8
- dcL8yKJ9AgMBAAECggEAJzC0cFQWxolZbdu9vPiSD7EvzvCjbD7Kb3LH/ntewAhX
9
- ubNPmGsrWweTMQjAPyOlfrEEuqRw3vCuvt9vqf03y0iEfLmDqD75yrF/0b66r5gd
10
- moeULXyFLjkb1eoG3ADN1MVojJxP8ri5O6Vaa0ykXW72HHtvUf8xMXfX0J+poQQm
11
- FnGC0g6ky6VfIlP6XxJNnC1EHcu3g1DxXEp8ALeP2UBiGuXNUTTXix+fqpVep2DP
12
- C+n/YTo7N6yqKrJCP97Fspd0We2rsT/DDPsOv4E44veLY/iZuyO01Eorp6PavXhg
13
- 0WJyGN4eww7F4yzYQcJZjM6MmEkYJHVxK0Nz5NIB4QKBgQD+oDmkD5mL365f/Yhr
14
- 32sRbTX311Grg0485us9rcyUj7HN82MVy3I5na/DxmQFyXJ3jaAi9cO3IFRpCyT5
15
- yVlNp0ufD4oBa/wbceVTOf5xkl0uRi9XxaC97r5kIWX/I4g3xRivqWW9I+Hs8PKv
16
- RphNFIadH81AbKVk0DD51usABQKBgQDMuyRHC1xN8uAOe1y23ytveFJImb0Rr6XL
17
- /ml/zpVzR+4r89FVI5NDYtKdUctkQuk6hSkPfLeURqekUD64nqK+5+hKuLy6Eqjw
18
- Vd5+Ah/Z18n1q37NuTwxi5XTBZfNDjWJnYKT3NSg1I10CVT+FDzzlA5AT0zzvTZM
19
- 0JeIDSq6GQKBgHWx8BLSlyHdace69FUQd3gdqAWAhKKn1gE2p+Phsx+0b/aHmvRX
20
- Dtxs8/KlgFRgckWqtCuUuDusePf5C8Vd+aZ4Pu8uCpdvp5+z/NGEjAVJJ0MddAK5
21
- OfyxH1Y/TdsqPGuy8h84SOuta1/PXA4CrqFqbHKyYXh2/9hil1DUs9lVAoGAcYaQ
22
- jkixbZPxRHaJqepElrJcxl9h5U3GHUE9VR7D5sILQxoXiSOKBILnEU+K/lTQKaAv
23
- baQV1EX9rfLFZPCqhDvqpoycMn4oaeTj1HHvIYg0OGNZlFBUHZEuim5+h7mKXH4Y
24
- K0/4JBrZOW/3TlEAn30JDgYrQLk6RAwjCtFqUPkCgYEA9Ukemwm/Tfx/YTzPnfrs
25
- BnaI9VBtqET/Z8/VvZcNTyuNcwkRJtRvnqHiJaAIZE+dSwdIHlgyZfTYDTVTEDhd
26
- NoiSrV/pgjLysSOzr8gqaO5alZNaBW+05/LqlluqSD7wyVs+lWaAviJ+SIpabt9j
27
- XMzR/9OBxoVDL4Zqny4nkB0=
28
- -----END PRIVATE KEY-----
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDLodEOCR2A593i
3
+ wZR7xkHOgHeCK697OXknn4okuUqopUo5qcQeqcvNJ+McMNGexwpg3YuIHKYYGmtw
4
+ 1QCoeqCOPoyZUed6GK5r7CkQl+hsCMrbRFpM8B8RmlsxVoot52WyfhF0lJT087g9
5
+ L4P1/rwcE6NGMkpvpCl/3mo90AYvFyX+LWpBFi4j3hx33LoTiuMunhOROWNobG1Z
6
+ GWYsoQriCq6mO9SOk1sbKXnr27yMaxbHcjZO36ZJxobrkHManVtmAQIlW0j66MLj
7
+ 6xsa9AZep0zFVQnoRZA56GYyH81RNAdxps1Nr7GYgRi4kyDLGvo2ZTJUuxpbiR68
8
+ dcL8yKJ9AgMBAAECggEAJzC0cFQWxolZbdu9vPiSD7EvzvCjbD7Kb3LH/ntewAhX
9
+ ubNPmGsrWweTMQjAPyOlfrEEuqRw3vCuvt9vqf03y0iEfLmDqD75yrF/0b66r5gd
10
+ moeULXyFLjkb1eoG3ADN1MVojJxP8ri5O6Vaa0ykXW72HHtvUf8xMXfX0J+poQQm
11
+ FnGC0g6ky6VfIlP6XxJNnC1EHcu3g1DxXEp8ALeP2UBiGuXNUTTXix+fqpVep2DP
12
+ C+n/YTo7N6yqKrJCP97Fspd0We2rsT/DDPsOv4E44veLY/iZuyO01Eorp6PavXhg
13
+ 0WJyGN4eww7F4yzYQcJZjM6MmEkYJHVxK0Nz5NIB4QKBgQD+oDmkD5mL365f/Yhr
14
+ 32sRbTX311Grg0485us9rcyUj7HN82MVy3I5na/DxmQFyXJ3jaAi9cO3IFRpCyT5
15
+ yVlNp0ufD4oBa/wbceVTOf5xkl0uRi9XxaC97r5kIWX/I4g3xRivqWW9I+Hs8PKv
16
+ RphNFIadH81AbKVk0DD51usABQKBgQDMuyRHC1xN8uAOe1y23ytveFJImb0Rr6XL
17
+ /ml/zpVzR+4r89FVI5NDYtKdUctkQuk6hSkPfLeURqekUD64nqK+5+hKuLy6Eqjw
18
+ Vd5+Ah/Z18n1q37NuTwxi5XTBZfNDjWJnYKT3NSg1I10CVT+FDzzlA5AT0zzvTZM
19
+ 0JeIDSq6GQKBgHWx8BLSlyHdace69FUQd3gdqAWAhKKn1gE2p+Phsx+0b/aHmvRX
20
+ Dtxs8/KlgFRgckWqtCuUuDusePf5C8Vd+aZ4Pu8uCpdvp5+z/NGEjAVJJ0MddAK5
21
+ OfyxH1Y/TdsqPGuy8h84SOuta1/PXA4CrqFqbHKyYXh2/9hil1DUs9lVAoGAcYaQ
22
+ jkixbZPxRHaJqepElrJcxl9h5U3GHUE9VR7D5sILQxoXiSOKBILnEU+K/lTQKaAv
23
+ baQV1EX9rfLFZPCqhDvqpoycMn4oaeTj1HHvIYg0OGNZlFBUHZEuim5+h7mKXH4Y
24
+ K0/4JBrZOW/3TlEAn30JDgYrQLk6RAwjCtFqUPkCgYEA9Ukemwm/Tfx/YTzPnfrs
25
+ BnaI9VBtqET/Z8/VvZcNTyuNcwkRJtRvnqHiJaAIZE+dSwdIHlgyZfTYDTVTEDhd
26
+ NoiSrV/pgjLysSOzr8gqaO5alZNaBW+05/LqlluqSD7wyVs+lWaAviJ+SIpabt9j
27
+ XMzR/9OBxoVDL4Zqny4nkB0=
28
+ -----END PRIVATE KEY-----