fcdns 0.3.1 → 0.3.2

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.
@@ -1,44 +1,44 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.readIPListFile = exports.writeIPListFile = void 0;
4
- const fs_1 = require("fs");
5
- const address_range_1 = require("address-range");
6
- const is_ipv4_address_1 = require("./is-ipv4-address");
7
- const is_ipv6_address_1 = require("./is-ipv6-address");
8
- async function writeIPListFile(filename, ranges) {
9
- await fs_1.promises.writeFile(filename, ranges.join('\n'));
10
- }
11
- exports.writeIPListFile = writeIPListFile;
12
- async function readIPListFile(filename) {
13
- const ipv4AddressRanges = [];
14
- const ipv6AddressRanges = [];
15
- const text = await fs_1.promises.readFile(filename, 'utf-8');
16
- text.split('\n')
17
- .filter(x => x.trim())
18
- .filter(x => x !== '')
19
- .forEach(x => {
20
- if ((0, is_ipv4_address_1.isIPv4Address)(x)) {
21
- ipv4AddressRanges.push(address_range_1.IPv4AddressRange.from(x, x));
22
- }
23
- if ((0, is_ipv6_address_1.isIPv6Address)(x)) {
24
- ipv6AddressRanges.push(address_range_1.IPv6AddressRange.from(x, x));
25
- }
26
- if (isIPv4AddressRange(x)) {
27
- const [startAddress, endAddress] = x.split('-');
28
- ipv4AddressRanges.push(address_range_1.IPv4AddressRange.from(startAddress, endAddress));
29
- }
30
- if (isIPv6AddressRange(x)) {
31
- const [startAddress, endAddress] = x.split('-');
32
- ipv6AddressRanges.push(address_range_1.IPv6AddressRange.from(startAddress, endAddress));
33
- }
34
- });
35
- return { ipv4: ipv4AddressRanges, ipv6: ipv6AddressRanges };
36
- }
37
- exports.readIPListFile = readIPListFile;
38
- function isIPv4AddressRange(text) {
39
- return /^[\d\.]+-[\d\.]+$/.test(text);
40
- }
41
- function isIPv6AddressRange(text) {
42
- return /^[\da-f:]+-[\da-f:]+$/.test(text);
43
- }
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readIPListFile = exports.writeIPListFile = void 0;
4
+ const fs_1 = require("fs");
5
+ const address_range_1 = require("address-range");
6
+ const is_ipv4_address_1 = require("./is-ipv4-address");
7
+ const is_ipv6_address_1 = require("./is-ipv6-address");
8
+ async function writeIPListFile(filename, ranges) {
9
+ await fs_1.promises.writeFile(filename, ranges.join('\n'));
10
+ }
11
+ exports.writeIPListFile = writeIPListFile;
12
+ async function readIPListFile(filename) {
13
+ const ipv4AddressRanges = [];
14
+ const ipv6AddressRanges = [];
15
+ const text = await fs_1.promises.readFile(filename, 'utf-8');
16
+ text.split('\n')
17
+ .filter(x => x.trim())
18
+ .filter(x => x !== '')
19
+ .forEach(x => {
20
+ if ((0, is_ipv4_address_1.isIPv4Address)(x)) {
21
+ ipv4AddressRanges.push(address_range_1.IPv4AddressRange.from(x, x));
22
+ }
23
+ if ((0, is_ipv6_address_1.isIPv6Address)(x)) {
24
+ ipv6AddressRanges.push(address_range_1.IPv6AddressRange.from(x, x));
25
+ }
26
+ if (isIPv4AddressRange(x)) {
27
+ const [startAddress, endAddress] = x.split('-');
28
+ ipv4AddressRanges.push(address_range_1.IPv4AddressRange.from(startAddress, endAddress));
29
+ }
30
+ if (isIPv6AddressRange(x)) {
31
+ const [startAddress, endAddress] = x.split('-');
32
+ ipv6AddressRanges.push(address_range_1.IPv6AddressRange.from(startAddress, endAddress));
33
+ }
34
+ });
35
+ return { ipv4: ipv4AddressRanges, ipv6: ipv6AddressRanges };
36
+ }
37
+ exports.readIPListFile = readIPListFile;
38
+ function isIPv4AddressRange(text) {
39
+ return /^[\d\.]+-[\d\.]+$/.test(text);
40
+ }
41
+ function isIPv6AddressRange(text) {
42
+ return /^[\da-f:]+-[\da-f:]+$/.test(text);
43
+ }
44
44
  //# sourceMappingURL=ip-list-file.js.map
@@ -1,25 +1,25 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isAlive = void 0;
4
- const extra_promise_1 = require("extra-promise");
5
- const ping_1 = require("ping");
6
- const go_1 = require("@blackglory/go");
7
- async function isAlive(address, timeoutMsecs) {
8
- try {
9
- const result = await Promise.race([
10
- (0, go_1.go)(async () => {
11
- const res = await ping_1.promise.probe(address);
12
- return res.alive;
13
- }),
14
- (0, extra_promise_1.timeout)(timeoutMsecs)
15
- ]);
16
- return result;
17
- }
18
- catch (e) {
19
- if (e instanceof extra_promise_1.TimeoutError)
20
- return false;
21
- throw e;
22
- }
23
- }
24
- exports.isAlive = isAlive;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isAlive = void 0;
4
+ const extra_promise_1 = require("extra-promise");
5
+ const ping_1 = require("ping");
6
+ const go_1 = require("@blackglory/go");
7
+ async function isAlive(address, timeoutMsecs) {
8
+ try {
9
+ const result = await Promise.race([
10
+ (0, go_1.go)(async () => {
11
+ const res = await ping_1.promise.probe(address);
12
+ return res.alive;
13
+ }),
14
+ (0, extra_promise_1.timeout)(timeoutMsecs)
15
+ ]);
16
+ return result;
17
+ }
18
+ catch (e) {
19
+ if (e instanceof extra_promise_1.TimeoutError)
20
+ return false;
21
+ throw e;
22
+ }
23
+ }
24
+ exports.isAlive = isAlive;
25
25
  //# sourceMappingURL=is-alive.js.map
@@ -1,8 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isIPv4Address = void 0;
4
- function isIPv4Address(text) {
5
- return /^[\d\.]+$/.test(text);
6
- }
7
- exports.isIPv4Address = isIPv4Address;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isIPv4Address = void 0;
4
+ function isIPv4Address(text) {
5
+ return /^[\d\.]+$/.test(text);
6
+ }
7
+ exports.isIPv4Address = isIPv4Address;
8
8
  //# sourceMappingURL=is-ipv4-address.js.map
@@ -1,8 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isIPv6Address = void 0;
4
- function isIPv6Address(text) {
5
- return /^[\da-f:]+$/.test(text);
6
- }
7
- exports.isIPv6Address = isIPv6Address;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isIPv6Address = void 0;
4
+ function isIPv6Address(text) {
5
+ return /^[\da-f:]+$/.test(text);
6
+ }
7
+ exports.isIPv6Address = isIPv6Address;
8
8
  //# sourceMappingURL=is-ipv6-address.js.map
@@ -1,16 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.levelToString = void 0;
4
- function levelToString(level) {
5
- switch (level) {
6
- case 3: return 'Info';
7
- case 2: return 'Debug';
8
- case 4: return 'Warn';
9
- case 1: return 'Trace';
10
- case 5: return 'Error';
11
- case 6: return 'Fatal';
12
- default: return 'None';
13
- }
14
- }
15
- exports.levelToString = levelToString;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.levelToString = void 0;
4
+ function levelToString(level) {
5
+ switch (level) {
6
+ case 3: return 'Info';
7
+ case 2: return 'Debug';
8
+ case 4: return 'Warn';
9
+ case 1: return 'Trace';
10
+ case 5: return 'Error';
11
+ case 6: return 'Fatal';
12
+ default: return 'None';
13
+ }
14
+ }
15
+ exports.levelToString = levelToString;
16
16
  //# sourceMappingURL=level-to-string.js.map
@@ -1,28 +1,28 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.appendMapFile = exports.writeMapFile = exports.readMapFile = void 0;
4
- const chaining_1 = require("iterable-operator/lib/es2018/style/chaining");
5
- const fs_1 = require("fs");
6
- const extra_filesystem_1 = require("extra-filesystem");
7
- async function readMapFile(filename) {
8
- await (0, extra_filesystem_1.ensureFile)(filename);
9
- const text = await fs_1.promises.readFile(filename, 'utf-8');
10
- const entries = text.split('\n')
11
- .filter(x => !!x)
12
- .map(x => JSON.parse(x));
13
- return new Map(entries);
14
- }
15
- exports.readMapFile = readMapFile;
16
- async function writeMapFile(filename, map) {
17
- const text = new chaining_1.IterableOperator(map.entries())
18
- .map(x => JSON.stringify(x))
19
- .toArray()
20
- .join('\n');
21
- await fs_1.promises.writeFile(filename, text + '\n');
22
- }
23
- exports.writeMapFile = writeMapFile;
24
- async function appendMapFile(filename, key, value) {
25
- await fs_1.promises.appendFile(filename, JSON.stringify([key, value]) + '\n');
26
- }
27
- exports.appendMapFile = appendMapFile;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.appendMapFile = exports.writeMapFile = exports.readMapFile = void 0;
4
+ const chaining_1 = require("iterable-operator/lib/es2018/style/chaining");
5
+ const fs_1 = require("fs");
6
+ const extra_filesystem_1 = require("extra-filesystem");
7
+ async function readMapFile(filename) {
8
+ await (0, extra_filesystem_1.ensureFile)(filename);
9
+ const text = await fs_1.promises.readFile(filename, 'utf-8');
10
+ const entries = text.split('\n')
11
+ .filter(x => !!x)
12
+ .map(x => JSON.parse(x));
13
+ return new Map(entries);
14
+ }
15
+ exports.readMapFile = readMapFile;
16
+ async function writeMapFile(filename, map) {
17
+ const text = new chaining_1.IterableOperator(map.entries())
18
+ .map(x => JSON.stringify(x))
19
+ .toArray()
20
+ .join('\n');
21
+ await fs_1.promises.writeFile(filename, text + '\n');
22
+ }
23
+ exports.writeMapFile = writeMapFile;
24
+ async function appendMapFile(filename, key, value) {
25
+ await fs_1.promises.appendFile(filename, JSON.stringify([key, value]) + '\n');
26
+ }
27
+ exports.appendMapFile = appendMapFile;
28
28
  //# sourceMappingURL=map-file.js.map
@@ -1,16 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseLogLevel = void 0;
4
- function parseLogLevel(level) {
5
- switch (level.toLowerCase()) {
6
- case 'trace': return 1;
7
- case 'debug': return 2;
8
- case 'info': return 3;
9
- case 'warn': return 4;
10
- case 'error': return 5;
11
- case 'fatal': return 6;
12
- default: return 7;
13
- }
14
- }
15
- exports.parseLogLevel = parseLogLevel;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseLogLevel = void 0;
4
+ function parseLogLevel(level) {
5
+ switch (level.toLowerCase()) {
6
+ case 'trace': return 1;
7
+ case 'debug': return 2;
8
+ case 'info': return 3;
9
+ case 'warn': return 4;
10
+ case 'error': return 5;
11
+ case 'fatal': return 6;
12
+ default: return 7;
13
+ }
14
+ }
15
+ exports.parseLogLevel = parseLogLevel;
16
16
  //# sourceMappingURL=parse-log-level.js.map
@@ -1,12 +1,12 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseServerInfo = void 0;
4
- function parseServerInfo(server) {
5
- const [host, port] = server.split(':');
6
- return {
7
- host,
8
- port: port ? Number.parseInt(port, 10) : undefined
9
- };
10
- }
11
- exports.parseServerInfo = parseServerInfo;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseServerInfo = void 0;
4
+ function parseServerInfo(server) {
5
+ const [host, port] = server.split(':');
6
+ return {
7
+ host,
8
+ port: port ? Number.parseInt(port, 10) : undefined
9
+ };
10
+ }
11
+ exports.parseServerInfo = parseServerInfo;
12
12
  //# sourceMappingURL=parse-server-info.js.map
@@ -1,19 +1,19 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolveA = exports.TimeoutError = void 0;
4
- const extra_promise_1 = require("extra-promise");
5
- var extra_promise_2 = require("extra-promise");
6
- Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return extra_promise_2.TimeoutError; } });
7
- async function resolveA(resolver, hostname, timeoutMsecs) {
8
- if (timeoutMsecs) {
9
- return await Promise.race([
10
- resolver.resolve4(hostname),
11
- (0, extra_promise_1.timeout)(timeoutMsecs)
12
- ]);
13
- }
14
- else {
15
- return await resolver.resolve4(hostname);
16
- }
17
- }
18
- exports.resolveA = resolveA;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveA = exports.TimeoutError = void 0;
4
+ const extra_promise_1 = require("extra-promise");
5
+ var extra_promise_2 = require("extra-promise");
6
+ Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return extra_promise_2.TimeoutError; } });
7
+ async function resolveA(resolver, hostname, timeoutMsecs) {
8
+ if (timeoutMsecs) {
9
+ return await Promise.race([
10
+ resolver.resolve4(hostname),
11
+ (0, extra_promise_1.timeout)(timeoutMsecs)
12
+ ]);
13
+ }
14
+ else {
15
+ return await resolver.resolve4(hostname);
16
+ }
17
+ }
18
+ exports.resolveA = resolveA;
19
19
  //# sourceMappingURL=resolve-a.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fcdns",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "DNS relay server with fact-checking.",
5
5
  "keywords": [
6
6
  "dns"
@@ -1,48 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.readAddressRangesFile = exports.writeAddressRangesFile = void 0;
4
- const fs_1 = require("fs");
5
- const address_range_1 = require("address-range");
6
- async function writeAddressRangesFile(filename, ranges) {
7
- await fs_1.promises.writeFile(filename, ranges.join('\n'));
8
- }
9
- exports.writeAddressRangesFile = writeAddressRangesFile;
10
- async function readAddressRangesFile(filename) {
11
- const ipv4AddressRanges = [];
12
- const ipv6AddressRanges = [];
13
- const text = await fs_1.promises.readFile(filename, 'utf-8');
14
- text.split('\n')
15
- .filter(x => x.trim())
16
- .filter(x => x !== '')
17
- .forEach(x => {
18
- if (isIPv4Address(x)) {
19
- ipv4AddressRanges.push(address_range_1.IPv4AddressRange.from(x, x));
20
- }
21
- if (isIPv6Address(x)) {
22
- ipv6AddressRanges.push(address_range_1.IPv6AddressRange.from(x, x));
23
- }
24
- if (isIPv4AddressRange(x)) {
25
- const [startAddress, endAddress] = x.split('-');
26
- ipv4AddressRanges.push(address_range_1.IPv4AddressRange.from(startAddress, endAddress));
27
- }
28
- if (isIPv6AddressRange(x)) {
29
- const [startAddress, endAddress] = x.split('-');
30
- ipv6AddressRanges.push(address_range_1.IPv6AddressRange.from(startAddress, endAddress));
31
- }
32
- });
33
- return { ipv4: ipv4AddressRanges, ipv6: ipv6AddressRanges };
34
- }
35
- exports.readAddressRangesFile = readAddressRangesFile;
36
- function isIPv4Address(text) {
37
- return /^[\d\.]+$/.test(text);
38
- }
39
- function isIPv4AddressRange(text) {
40
- return /^[\d\.]+-[\d\.]+$/.test(text);
41
- }
42
- function isIPv6Address(text) {
43
- return /^[\da-f:]$/.test(text);
44
- }
45
- function isIPv6AddressRange(text) {
46
- return /^[\da-f:]+-[\da-f:]+$/.test(text);
47
- }
48
- //# sourceMappingURL=address-ranges-file.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"address-ranges-file.js","sourceRoot":"","sources":["../../src/utils/address-ranges-file.ts"],"names":[],"mappings":";;;AAAA,2BAAmC;AACnC,iDAAgF;AAEzE,KAAK,UAAU,sBAAsB,CAC1C,QAAgB,EAChB,MAAsB;IAEtB,MAAM,aAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AACjD,CAAC;AALD,wDAKC;AAEM,KAAK,UAAU,qBAAqB,CACzC,QAAgB;IAEhB,MAAM,iBAAiB,GAAuB,EAAE,CAAA;IAChD,MAAM,iBAAiB,GAAuB,EAAE,CAAA;IAEhD,MAAM,IAAI,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SACb,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;SACrB,OAAO,CAAC,CAAC,CAAC,EAAE;QACX,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE;YACpB,iBAAiB,CAAC,IAAI,CAAC,gCAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;SACpD;QAED,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE;YACpB,iBAAiB,CAAC,IAAI,CAAC,gCAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;SACpD;QAED,IAAI,kBAAkB,CAAC,CAAC,CAAC,EAAE;YACzB,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC/C,iBAAiB,CAAC,IAAI,CAAC,gCAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAA;SACxE;QAED,IAAI,kBAAkB,CAAC,CAAC,CAAC,EAAE;YACzB,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC/C,iBAAiB,CAAC,IAAI,CAAC,gCAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAA;SACxE;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAA;AAC7D,CAAC;AA/BD,sDA+BC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACvC,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3C,CAAC"}
package/lib/whitelist.js DELETED
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Whitelist = void 0;
4
- const async_constructor_1 = require("async-constructor");
5
- const address_ranges_file_1 = require("./utils/address-ranges-file");
6
- class Whitelist extends async_constructor_1.AsyncConstructor {
7
- constructor(filename) {
8
- super(async () => {
9
- const { ipv4, ipv6 } = await address_ranges_file_1.readAddressRangesFile(filename);
10
- this.ipv4 = ipv4;
11
- this.ipv6 = ipv6;
12
- });
13
- }
14
- includes(address) {
15
- if (isIPv4Address(address)) {
16
- return this.ipv4.some(x => x.includes(address));
17
- }
18
- if (isIPv6Address(address)) {
19
- return this.ipv6.some(x => x.includes(address));
20
- }
21
- return false;
22
- }
23
- }
24
- exports.Whitelist = Whitelist;
25
- function isIPv4Address(address) {
26
- return /^[\d\.]+$/.test(address);
27
- }
28
- function isIPv6Address(address) {
29
- return /^[\da-f:]+$/.test(address);
30
- }
31
- //# sourceMappingURL=whitelist.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"whitelist.js","sourceRoot":"","sources":["../src/whitelist.ts"],"names":[],"mappings":";;;AACA,yDAAoD;AACpD,oEAAkE;AAElE,MAAa,SAAU,SAAQ,oCAAgB;IAI7C,YAAY,QAAgB;QAC1B,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,2CAAqB,CAAC,QAAQ,CAAC,CAAA;YAC5D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAClB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE;YAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;SAChD;QAED,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE;YAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;SAChD;QAED,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAvBD,8BAuBC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACpC,CAAC"}