@pioneer-platform/blockbook 8.1.38 → 8.1.39

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/lib/index.js CHANGED
@@ -1,72 +1,87 @@
1
1
  "use strict";
2
2
  /*
3
3
 
4
+ Blockbooks
5
+
6
+ https://documenter.getpostman.com/view/13630829/TVmFkLwy
7
+
8
+ ada.nownodes.io
9
+ algo.nownodes.io
10
+ bch.nownodes.io
11
+ bsc.nownodes.io
12
+ bsv.nownodes.io
13
+ btc.nownodes.io
14
+ btg.nownodes.io
15
+ clo.nownodes.io
16
+ dash.nownodes.io
17
+ dcr.nownodes.io
18
+ dgb.nownodes.io
19
+ doge.nownodes.io
20
+ dot.nownodes.io
21
+ eos.nownodes.io
22
+ eth.nownodes.io
23
+ grs.nownodes.io
24
+ kmd.nownodes.io
25
+ ltc.nownodes.io
26
+ nano.nownodes.io
27
+ ont.nownodes.io
28
+ rdd.nownodes.io
29
+ trx.nownodes.io
30
+ usdt-omni.nownodes.io
31
+ vet.nownodes.io
32
+ xem.nownodes.io
33
+ xmr.nownodes.io
34
+ xtz.nownodes.io
35
+ xvg.nownodes.io
36
+ xzc.nownodes.io
37
+ zec.nownodes.io
38
+ zen.nownodes.io
39
+ zil.nownodes.io
40
+
41
+
4
42
 
5
43
  */
6
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
- return new (P || (P = Promise))(function (resolve, reject) {
9
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
- step((generator = generator.apply(thisArg, _arguments || [])).next());
13
- });
14
- };
15
- var __generator = (this && this.__generator) || function (thisArg, body) {
16
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
17
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
18
- function verb(n) { return function (v) { return step([n, v]); }; }
19
- function step(op) {
20
- if (f) throw new TypeError("Generator is already executing.");
21
- while (_) try {
22
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
23
- if (y = 0, t) op = [op[0] & 2, t.value];
24
- switch (op[0]) {
25
- case 0: case 1: t = op; break;
26
- case 4: _.label++; return { value: op[1], done: false };
27
- case 5: _.label++; y = op[1]; op = [0]; continue;
28
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
29
- default:
30
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
31
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
32
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
33
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
34
- if (t[2]) _.ops.pop();
35
- _.trys.pop(); continue;
36
- }
37
- op = body.call(thisArg, _);
38
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
39
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
40
- }
41
- };
42
- var TAG = " | blockbook-client | ";
43
- var log = require('@pioneer-platform/loggerdog')();
44
- var fakeUa = require('fake-useragent');
45
- var Axios = require('axios');
46
- var https = require('https');
47
- var axios = Axios.create({
44
+ const TAG = " | blockbook-client | ";
45
+ const log = require('@pioneer-platform/loggerdog')();
46
+ const fakeUa = require('fake-useragent');
47
+ const Axios = require('axios');
48
+ const https = require('https');
49
+ const axios = Axios.create({
48
50
  httpsAgent: new https.Agent({
49
51
  rejectUnauthorized: false
50
- })
52
+ }),
53
+ headers: {
54
+ "api-key": process.env['NOW_NODES_API'] //the token is a variable which holds the token
55
+ }
51
56
  });
52
- var axiosRetry = require('axios-retry');
57
+ // if(!process.env['NOW_NODES_API']) throw Error("invalid env missing NOW_NODES_API")
58
+ const axiosRetry = require('axios-retry');
59
+ //@ts-ignore
53
60
  axiosRetry(axios, {
54
61
  retries: 3,
55
- retryDelay: function (retryCount) {
56
- console.log("retry attempt: " + retryCount);
62
+ retryDelay: (retryCount) => {
63
+ console.log(`retry attempt: ${retryCount}`);
57
64
  return retryCount * 2000; // time interval between retries
58
65
  },
59
- retryCondition: function (error) {
66
+ retryCondition: (error) => {
60
67
  console.error(error);
61
68
  // if retry condition is not specified, by default idempotent requests are retried
62
69
  return error.response.status === 503;
63
70
  },
64
71
  });
65
- var BLOCKBOOK_URLS = {
72
+ let BLOCKBOOK_URLS = {
66
73
  'BTC': process.env['BTC_BLOCKBOOK_URL'],
67
74
  'ETH': process.env['ETH_BLOCKBOOK_URL'],
68
75
  'BCH': process.env['BCH_BLOCKBOOK_URL'],
76
+ 'LTC': process.env['LTC_BLOCKBOOK_URL'],
69
77
  'DOGE': process.env['DOGE_BLOCKBOOK_URL'],
78
+ 'DASH': process.env['DASH_BLOCKBOOK_URL'],
79
+ 'DGB': process.env['DGB_BLOCKBOOK_URL'],
80
+ 'KMD': process.env['KMD_BLOCKBOOK_URL'],
81
+ 'RDD': process.env['RDD_BLOCKBOOK_URL'],
82
+ 'BSV': process.env['BSV_BLOCKBOOK_URL'],
83
+ 'BTG': process.env['BTG_BLOCKBOOK_URL'],
84
+ 'ADA': process.env['ADA_BLOCKBOOK_URL'],
70
85
  };
71
86
  module.exports = {
72
87
  init: function (servers, runtime) {
@@ -100,288 +115,181 @@ module.exports = {
100
115
  return broadcast_transaction(coin, hex);
101
116
  },
102
117
  };
103
- var get_info_by_pubkey = function (coin, pubkey, page) {
104
- return __awaiter(this, void 0, void 0, function () {
105
- var tag, url, body, resp, e_1;
106
- return __generator(this, function (_a) {
107
- switch (_a.label) {
108
- case 0:
109
- tag = TAG + " | get_info_by_pubkey | ";
110
- _a.label = 1;
111
- case 1:
112
- _a.trys.push([1, 3, , 4]);
113
- if (!page)
114
- page = "1";
115
- url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/xpub/" + pubkey;
116
- log.debug(tag, "url: ", url);
117
- body = {
118
- method: 'GET',
119
- url: url,
120
- headers: {
121
- 'content-type': 'application/json',
122
- 'User-Agent': fakeUa()
123
- },
124
- };
125
- return [4 /*yield*/, axios(body)];
126
- case 2:
127
- resp = _a.sent();
128
- log.debug(tag, "resp: ", resp);
129
- //TODO paginate?
130
- return [2 /*return*/, resp.data];
131
- case 3:
132
- e_1 = _a.sent();
133
- console.error(tag, e_1);
134
- return [3 /*break*/, 4];
135
- case 4: return [2 /*return*/];
136
- }
137
- });
138
- });
118
+ let get_info_by_pubkey = async function (coin, pubkey, page) {
119
+ let tag = TAG + " | get_info_by_pubkey | ";
120
+ try {
121
+ if (!page)
122
+ page = "1";
123
+ let url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/xpub/" + pubkey;
124
+ log.debug(tag, "url: ", url);
125
+ let body = {
126
+ method: 'GET',
127
+ url,
128
+ headers: {
129
+ 'content-type': 'application/json',
130
+ 'User-Agent': fakeUa()
131
+ },
132
+ };
133
+ let resp = await axios(body);
134
+ log.debug(tag, "resp: ", resp);
135
+ //TODO paginate?
136
+ return resp.data;
137
+ }
138
+ catch (e) {
139
+ console.error(tag, e);
140
+ }
139
141
  };
140
- var get_txids_by_address = function (coin, address, page) {
141
- return __awaiter(this, void 0, void 0, function () {
142
- var tag, url, body, resp, e_2;
143
- return __generator(this, function (_a) {
144
- switch (_a.label) {
145
- case 0:
146
- tag = TAG + " | get_txids_by_address | ";
147
- _a.label = 1;
148
- case 1:
149
- _a.trys.push([1, 3, , 4]);
150
- if (!page)
151
- page = 1;
152
- url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/address/" + address + "?page=" + page + "&details=all";
153
- log.debug(tag, "url: ", url);
154
- body = {
155
- method: 'GET',
156
- url: url,
157
- headers: {
158
- 'content-type': 'application/json',
159
- 'User-Agent': fakeUa()
160
- },
161
- };
162
- return [4 /*yield*/, axios(body)
163
- //TODO paginate?
164
- ];
165
- case 2:
166
- resp = _a.sent();
167
- //TODO paginate?
168
- return [2 /*return*/, resp.data];
169
- case 3:
170
- e_2 = _a.sent();
171
- console.error(tag, e_2);
172
- return [3 /*break*/, 4];
173
- case 4: return [2 /*return*/];
174
- }
175
- });
176
- });
142
+ let get_txids_by_address = async function (coin, address, page) {
143
+ let tag = TAG + " | get_txids_by_address | ";
144
+ try {
145
+ if (!page)
146
+ page = 1;
147
+ let url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/address/" + address + "?page=" + page + "&details=all";
148
+ log.debug(tag, "url: ", url);
149
+ let body = {
150
+ method: 'GET',
151
+ url,
152
+ headers: {
153
+ 'content-type': 'application/json',
154
+ 'User-Agent': fakeUa()
155
+ },
156
+ };
157
+ let resp = await axios(body);
158
+ //TODO paginate?
159
+ return resp.data;
160
+ }
161
+ catch (e) {
162
+ console.error(tag, e);
163
+ }
177
164
  };
178
- var get_info_by_address = function (coin, address, filter) {
179
- return __awaiter(this, void 0, void 0, function () {
180
- var tag, url, body, resp, e_3;
181
- return __generator(this, function (_a) {
182
- switch (_a.label) {
183
- case 0:
184
- tag = TAG + " | get_info_by_address | ";
185
- _a.label = 1;
186
- case 1:
187
- _a.trys.push([1, 3, , 4]);
188
- if (!filter)
189
- filter = "all";
190
- url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/address/" + address + "?details=all";
191
- body = {
192
- method: 'GET',
193
- url: url,
194
- headers: {
195
- 'content-type': 'application/json',
196
- 'User-Agent': fakeUa()
197
- },
198
- };
199
- return [4 /*yield*/, axios(body)
200
- //TODO paginate?
201
- ];
202
- case 2:
203
- resp = _a.sent();
204
- //TODO paginate?
205
- return [2 /*return*/, resp.data];
206
- case 3:
207
- e_3 = _a.sent();
208
- console.error(tag, e_3);
209
- return [3 /*break*/, 4];
210
- case 4: return [2 /*return*/];
211
- }
212
- });
213
- });
165
+ let get_info_by_address = async function (coin, address, filter) {
166
+ let tag = TAG + " | get_info_by_address | ";
167
+ try {
168
+ if (!filter)
169
+ filter = "all";
170
+ //let url = ETH_BLOCKBOOK_URL+"/api/v2/address/"+address+"?="+filter
171
+ let url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/address/" + address + "?details=all";
172
+ let body = {
173
+ method: 'GET',
174
+ url,
175
+ headers: {
176
+ 'content-type': 'application/json',
177
+ 'User-Agent': fakeUa()
178
+ },
179
+ };
180
+ let resp = await axios(body);
181
+ //TODO paginate?
182
+ return resp.data;
183
+ }
184
+ catch (e) {
185
+ console.error(tag, e);
186
+ }
214
187
  };
215
- var get_txs_by_xpub = function (coin, xpub) {
216
- return __awaiter(this, void 0, void 0, function () {
217
- var tag, url, body, resp, e_4;
218
- return __generator(this, function (_a) {
219
- switch (_a.label) {
220
- case 0:
221
- tag = TAG + " | FA get_txs_by_xpub | ";
222
- _a.label = 1;
223
- case 1:
224
- _a.trys.push([1, 3, , 4]);
225
- url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/xpub/" + xpub + "?details=all";
226
- console.log("url: ", url);
227
- body = {
228
- method: 'GET',
229
- url: url,
230
- headers: {
231
- 'content-type': 'application/json',
232
- 'User-Agent': fakeUa()
233
- },
234
- };
235
- return [4 /*yield*/, axios(body)];
236
- case 2:
237
- resp = _a.sent();
238
- return [2 /*return*/, resp.data];
239
- case 3:
240
- e_4 = _a.sent();
241
- console.error(tag, e_4);
242
- return [3 /*break*/, 4];
243
- case 4: return [2 /*return*/];
244
- }
245
- });
246
- });
188
+ let get_txs_by_xpub = async function (coin, xpub) {
189
+ let tag = TAG + " | FA get_txs_by_xpub | ";
190
+ try {
191
+ let url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/xpub/" + xpub + "?details=all";
192
+ console.log("url: ", url);
193
+ let body = {
194
+ method: 'GET',
195
+ url,
196
+ headers: {
197
+ 'content-type': 'application/json',
198
+ 'User-Agent': fakeUa()
199
+ },
200
+ };
201
+ let resp = await axios(body);
202
+ return resp.data;
203
+ }
204
+ catch (e) {
205
+ console.error(tag, e);
206
+ }
247
207
  };
248
- var broadcast_transaction = function (coin, hex) {
249
- return __awaiter(this, void 0, void 0, function () {
250
- var tag, url, data, body, resp, e_5;
251
- return __generator(this, function (_a) {
252
- switch (_a.label) {
253
- case 0:
254
- tag = TAG + " | broadcast_transaction | ";
255
- _a.label = 1;
256
- case 1:
257
- _a.trys.push([1, 3, , 4]);
258
- url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/sendtx/";
259
- data = hex;
260
- body = {
261
- url: url,
262
- headers: {
263
- 'content-type': 'application/json',
264
- 'User-Agent': fakeUa()
265
- },
266
- method: 'POST',
267
- json: false,
268
- data: data,
269
- };
270
- return [4 /*yield*/, axios(body)];
271
- case 2:
272
- resp = _a.sent();
273
- return [2 /*return*/, resp.data];
274
- case 3:
275
- e_5 = _a.sent();
276
- console.error(tag, e_5);
277
- return [3 /*break*/, 4];
278
- case 4: return [2 /*return*/];
279
- }
280
- });
281
- });
208
+ let broadcast_transaction = async function (coin, hex) {
209
+ let tag = TAG + " | broadcast_transaction | ";
210
+ try {
211
+ let url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/sendtx/";
212
+ let data = hex;
213
+ let body = {
214
+ url,
215
+ headers: {
216
+ 'content-type': 'application/json',
217
+ 'User-Agent': fakeUa()
218
+ },
219
+ method: 'POST',
220
+ json: false,
221
+ data,
222
+ };
223
+ let resp = await axios(body);
224
+ return resp.data;
225
+ }
226
+ catch (e) {
227
+ console.error(tag, e);
228
+ }
282
229
  };
283
- var get_transaction = function (coin, txid) {
284
- return __awaiter(this, void 0, void 0, function () {
285
- var tag, url, body, resp, e_6;
286
- return __generator(this, function (_a) {
287
- switch (_a.label) {
288
- case 0:
289
- tag = TAG + " | get_transaction | ";
290
- _a.label = 1;
291
- case 1:
292
- _a.trys.push([1, 3, , 4]);
293
- url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/tx/" + txid;
294
- body = {
295
- method: 'GET',
296
- url: url,
297
- headers: {
298
- 'content-type': 'application/json',
299
- 'User-Agent': fakeUa()
300
- },
301
- };
302
- return [4 /*yield*/, axios(body)];
303
- case 2:
304
- resp = _a.sent();
305
- return [2 /*return*/, resp.data];
306
- case 3:
307
- e_6 = _a.sent();
308
- console.error(tag, e_6);
309
- return [3 /*break*/, 4];
310
- case 4: return [2 /*return*/];
311
- }
312
- });
313
- });
230
+ let get_transaction = async function (coin, txid) {
231
+ let tag = TAG + " | get_transaction | ";
232
+ try {
233
+ let url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/tx/" + txid;
234
+ let body = {
235
+ method: 'GET',
236
+ url,
237
+ headers: {
238
+ 'content-type': 'application/json',
239
+ 'User-Agent': fakeUa()
240
+ },
241
+ };
242
+ let resp = await axios(body);
243
+ return resp.data;
244
+ }
245
+ catch (e) {
246
+ console.error(tag, e);
247
+ }
314
248
  };
315
- var get_utxos_by_xpub = function (coin, xpub) {
316
- return __awaiter(this, void 0, void 0, function () {
317
- var tag, url, body, resp, e_7;
318
- return __generator(this, function (_a) {
319
- switch (_a.label) {
320
- case 0:
321
- tag = TAG + " | FA get_utxos_by_xpub | ";
322
- _a.label = 1;
323
- case 1:
324
- _a.trys.push([1, 3, , 4]);
325
- url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/utxo/" + xpub + "?confirmed=false";
326
- console.log("url: ", url);
327
- body = {
328
- method: 'GET',
329
- url: url,
330
- headers: {
331
- 'content-type': 'application/json',
332
- 'User-Agent': fakeUa()
333
- },
334
- };
335
- return [4 /*yield*/, axios(body)];
336
- case 2:
337
- resp = _a.sent();
338
- return [2 /*return*/, resp.data];
339
- case 3:
340
- e_7 = _a.sent();
341
- console.error(tag, e_7);
342
- return [3 /*break*/, 4];
343
- case 4: return [2 /*return*/];
344
- }
345
- });
346
- });
249
+ let get_utxos_by_xpub = async function (coin, xpub) {
250
+ let tag = TAG + " | FA get_utxos_by_xpub | ";
251
+ try {
252
+ let url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/utxo/" + xpub + "?confirmed=false";
253
+ console.log("url: ", url);
254
+ let body = {
255
+ method: 'GET',
256
+ url,
257
+ headers: {
258
+ 'content-type': 'application/json',
259
+ 'User-Agent': fakeUa()
260
+ },
261
+ };
262
+ let resp = await axios(body);
263
+ return resp.data;
264
+ }
265
+ catch (e) {
266
+ console.error(tag, e);
267
+ }
347
268
  };
348
- var get_balance_by_xpub = function (coin, xpub) {
349
- return __awaiter(this, void 0, void 0, function () {
350
- var tag, output, balance, i, uxto, e_8;
351
- return __generator(this, function (_a) {
352
- switch (_a.label) {
353
- case 0:
354
- tag = TAG + " | get_balance_by_xpub | ";
355
- _a.label = 1;
356
- case 1:
357
- _a.trys.push([1, 3, , 4]);
358
- log.debug(tag, "coin: ", coin);
359
- log.debug(tag, "xpub: ", xpub);
360
- return [4 /*yield*/, get_utxos_by_xpub(coin, xpub)];
361
- case 2:
362
- output = _a.sent();
363
- log.debug(tag, "output: ", output);
364
- balance = 0;
365
- //tally
366
- for (i = 0; i < output.length; i++) {
367
- uxto = output[i];
368
- balance = balance + parseInt(uxto.value);
369
- }
370
- return [2 /*return*/, balance / 100000000];
371
- case 3:
372
- e_8 = _a.sent();
373
- console.error(tag, e_8);
374
- return [3 /*break*/, 4];
375
- case 4: return [2 /*return*/];
376
- }
377
- });
378
- });
269
+ let get_balance_by_xpub = async function (coin, xpub) {
270
+ let tag = TAG + " | get_balance_by_xpub | ";
271
+ try {
272
+ log.debug(tag, "coin: ", coin);
273
+ log.debug(tag, "xpub: ", xpub);
274
+ let output = await get_utxos_by_xpub(coin, xpub);
275
+ log.debug(tag, "output: ", output);
276
+ let balance = 0;
277
+ //tally
278
+ for (let i = 0; i < output.length; i++) {
279
+ let uxto = output[i];
280
+ balance = balance + parseInt(uxto.value);
281
+ }
282
+ return balance / 100000000;
283
+ }
284
+ catch (e) {
285
+ console.error(tag, e);
286
+ }
379
287
  };
380
- var init_network = function (servers, runtime) {
381
- var tag = ' | get_txs_by_address | ';
288
+ let init_network = function (servers, runtime) {
289
+ let tag = ' | get_txs_by_address | ';
382
290
  try {
383
291
  log.debug(tag, "checkpoint: ");
384
- var output = [];
292
+ let output = [];
385
293
  //get networks from coins module
386
294
  // let blockbooks = getBlockBooks()
387
295
  // for(let i = 0; i < blockbooks.length; i++){
@@ -411,18 +319,12 @@ var init_network = function (servers, runtime) {
411
319
  throw e;
412
320
  }
413
321
  };
414
- var get_node_info = function () {
415
- return __awaiter(this, void 0, void 0, function () {
416
- var tag;
417
- return __generator(this, function (_a) {
418
- tag = TAG + " | get_node_info | ";
419
- try {
420
- return [2 /*return*/, true];
421
- }
422
- catch (e) {
423
- console.error(tag, e);
424
- }
425
- return [2 /*return*/];
426
- });
427
- });
322
+ let get_node_info = async function () {
323
+ let tag = TAG + " | get_node_info | ";
324
+ try {
325
+ return true;
326
+ }
327
+ catch (e) {
328
+ console.error(tag, e);
329
+ }
428
330
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pioneer-platform/blockbook",
3
- "version": "8.1.38",
3
+ "version": "8.1.39",
4
4
  "main": "./lib/index.js",
5
5
  "types": "./lib/main.d.ts",
6
6
  "scripts": {
@@ -27,5 +27,5 @@
27
27
  "ts-node": "^8.8.2",
28
28
  "typescript": "^3.9.5"
29
29
  },
30
- "gitHead": "54c5830a9aebf63dc437dd0cdd4bd3ea3edb253f"
30
+ "gitHead": "d0e74ea447175d6d7e9697793093f9155f0dab38"
31
31
  }
package/tsconfig.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "target": "es5",
3
+ "target": "es2018",
4
4
  "module": "commonjs",
5
5
  "lib": ["es6", "es2015", "dom"],
6
6
  "declaration": true,