@siegesailor/cryptography 1.0.0

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.
Files changed (95) hide show
  1. package/LICENSE.md +19 -0
  2. package/README.md +79 -0
  3. package/build/algorithms/baby-step-giant-step/index.js +89 -0
  4. package/build/algorithms/baby-step-giant-step/index.js.map +1 -0
  5. package/build/algorithms/baby-step-giant-step/index.test.js +32 -0
  6. package/build/algorithms/baby-step-giant-step/index.test.js.map +1 -0
  7. package/build/algorithms/blum-blum-shub/index.js +88 -0
  8. package/build/algorithms/blum-blum-shub/index.js.map +1 -0
  9. package/build/algorithms/blum-blum-shub/index.test.js +74 -0
  10. package/build/algorithms/blum-blum-shub/index.test.js.map +1 -0
  11. package/build/algorithms/chinese-remainder/index.js +111 -0
  12. package/build/algorithms/chinese-remainder/index.js.map +1 -0
  13. package/build/algorithms/chinese-remainder/index.test.js +28 -0
  14. package/build/algorithms/chinese-remainder/index.test.js.map +1 -0
  15. package/build/algorithms/euclidean/index.js +60 -0
  16. package/build/algorithms/euclidean/index.js.map +1 -0
  17. package/build/algorithms/euclidean/index.test.js +22 -0
  18. package/build/algorithms/euclidean/index.test.js.map +1 -0
  19. package/build/algorithms/extended-euclidean/index.js +77 -0
  20. package/build/algorithms/extended-euclidean/index.js.map +1 -0
  21. package/build/algorithms/extended-euclidean/index.test.js +22 -0
  22. package/build/algorithms/extended-euclidean/index.test.js.map +1 -0
  23. package/build/algorithms/fast-modular-exponentiation/index.js +80 -0
  24. package/build/algorithms/fast-modular-exponentiation/index.js.map +1 -0
  25. package/build/algorithms/fast-modular-exponentiation/index.test.js +31 -0
  26. package/build/algorithms/fast-modular-exponentiation/index.test.js.map +1 -0
  27. package/build/algorithms/miller-rabin-primarily-test/index.js +87 -0
  28. package/build/algorithms/miller-rabin-primarily-test/index.js.map +1 -0
  29. package/build/algorithms/miller-rabin-primarily-test/index.test.js +78 -0
  30. package/build/algorithms/miller-rabin-primarily-test/index.test.js.map +1 -0
  31. package/build/algorithms/multiplicative-inverse/index.js +83 -0
  32. package/build/algorithms/multiplicative-inverse/index.js.map +1 -0
  33. package/build/algorithms/multiplicative-inverse/index.test.js +30 -0
  34. package/build/algorithms/multiplicative-inverse/index.test.js.map +1 -0
  35. package/build/algorithms/naor-reingo/index.js +85 -0
  36. package/build/algorithms/naor-reingo/index.js.map +1 -0
  37. package/build/algorithms/naor-reingo/index.test.js +27 -0
  38. package/build/algorithms/naor-reingo/index.test.js.map +1 -0
  39. package/build/algorithms/pollard-p-1-factorization/index.js +92 -0
  40. package/build/algorithms/pollard-p-1-factorization/index.js.map +1 -0
  41. package/build/algorithms/pollard-p-1-factorization/index.test.js +32 -0
  42. package/build/algorithms/pollard-p-1-factorization/index.test.js.map +1 -0
  43. package/build/algorithms/pollard-rho/index.js +82 -0
  44. package/build/algorithms/pollard-rho/index.js.map +1 -0
  45. package/build/algorithms/pollard-rho/index.test.js +26 -0
  46. package/build/algorithms/pollard-rho/index.test.js.map +1 -0
  47. package/build/algorithms/primitive-root-search/index.js +95 -0
  48. package/build/algorithms/primitive-root-search/index.js.map +1 -0
  49. package/build/algorithms/primitive-root-search/index.test.js +46 -0
  50. package/build/algorithms/primitive-root-search/index.test.js.map +1 -0
  51. package/build/command.js +79 -0
  52. package/build/command.js.map +1 -0
  53. package/build/entry-point.js +31 -0
  54. package/build/entry-point.js.map +1 -0
  55. package/build/key-encryptions/DiffieHellman.js +56 -0
  56. package/build/key-encryptions/DiffieHellman.js.map +1 -0
  57. package/build/key-encryptions/ElGamal.js +83 -0
  58. package/build/key-encryptions/ElGamal.js.map +1 -0
  59. package/build/key-encryptions/RSA.js +102 -0
  60. package/build/key-encryptions/RSA.js.map +1 -0
  61. package/build/shared/algorithm/math.js +9 -0
  62. package/build/shared/algorithm/math.js.map +1 -0
  63. package/build/shared/algorithm/random.js +52 -0
  64. package/build/shared/algorithm/random.js.map +1 -0
  65. package/build/shared/algorithm/wasm.js +105 -0
  66. package/build/shared/algorithm/wasm.js.map +1 -0
  67. package/build/shared/algorithm/wrap.js +57 -0
  68. package/build/shared/algorithm/wrap.js.map +1 -0
  69. package/build/shared/cli/Procedure.js +51 -0
  70. package/build/shared/cli/Procedure.js.map +1 -0
  71. package/build/shared/cli/chalk.js +48 -0
  72. package/build/shared/cli/chalk.js.map +1 -0
  73. package/build/shared/cli/inquirer.js +13 -0
  74. package/build/shared/cli/inquirer.js.map +1 -0
  75. package/build/shared/cli/prompt.js +98 -0
  76. package/build/shared/cli/prompt.js.map +1 -0
  77. package/build/shared/cli/utilities.js +145 -0
  78. package/build/shared/cli/utilities.js.map +1 -0
  79. package/build/shared/constants.js +21 -0
  80. package/build/shared/constants.js.map +1 -0
  81. package/build/shared/testing/wasm.js +78 -0
  82. package/build/shared/testing/wasm.js.map +1 -0
  83. package/build/source/algorithms/baby-step-giant-step/main.wasm +0 -0
  84. package/build/source/algorithms/blum-blum-shub/main.wasm +0 -0
  85. package/build/source/algorithms/chinese-remainder/main.wasm +0 -0
  86. package/build/source/algorithms/euclidean/main.wasm +0 -0
  87. package/build/source/algorithms/extended-euclidean/main.wasm +0 -0
  88. package/build/source/algorithms/fast-modular-exponentiation/main.wasm +0 -0
  89. package/build/source/algorithms/miller-rabin-primarily-test/main.wasm +0 -0
  90. package/build/source/algorithms/multiplicative-inverse/main.wasm +0 -0
  91. package/build/source/algorithms/naor-reingo/main.wasm +0 -0
  92. package/build/source/algorithms/pollard-p-1-factorization/main.wasm +0 -0
  93. package/build/source/algorithms/pollard-rho/main.wasm +0 -0
  94. package/build/source/algorithms/primitive-root-search/main.wasm +0 -0
  95. package/package.json +79 -0
package/LICENSE.md ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2026 Jin Yu Zhang
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
17
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
18
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
19
+ OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # Cryptography
2
+
3
+ [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-%23FE5196?logo=conventionalcommits&logoColor=white)](https://conventionalcommits.org)
4
+
5
+ This library provides a collection of cryptography algorithms. It serves as a learning resource (Inspired by [Boston University MET CS 789 Cryptography](https://www.bu.edu/academics/met/courses/met-cs-789/)) for understanding the implementation of various cryptographic algorithms and their applications in key encryption flows. The library is also production-ready, with a focus on performance and security, making it suitable for use in real-world applications:
6
+
7
+ | Algorithm | JavaScript | TypeScript | WebAssembly |
8
+ | --------------------------- | ---------- | ---------- | ----------- |
9
+ | Baby Step Giant Step | ✅ | ✅ | ✅ |
10
+ | Blum Blum Shub | ✅ | ✅ | ✅ |
11
+ | Chinese Remainder | ✅ | ✅ | ✅ |
12
+ | Euclidean | ✅ | ✅ | ✅ |
13
+ | Extended Euclidean | ✅ | ✅ | ✅ |
14
+ | Fast Modular Exponentiation | ✅ | ✅ | ✅ |
15
+ | Miller Rabin Primality Test | ✅ | ✅ | ✅ |
16
+ | Multiplicative Inverse | ✅ | ✅ | ✅ |
17
+ | Naor Reingo | ✅ | ✅ | ✅ |
18
+ | Pollard P-1 Factorization | ✅ | ✅ | ✅ |
19
+ | Pollard Rho | ✅ | ✅ | ✅ |
20
+ | Primitive Root Search | ✅ | ✅ | ✅ |
21
+
22
+ > [!tip]
23
+ > Zero configuration needed. WebAssembly availability is determined at runtime, with a safe fallback to JavaScript with TypeScript support implemented.
24
+
25
+ And, a CLI is available to interact with these algorithms and demonstrate the 3 key encryption flows:
26
+
27
+ - [Diffie Hellman Key Exchange](./source/key-encryptions/DiffieHellman.ts)
28
+ - [ElGamal](./source/key-encryptions/ElGamal.ts)
29
+ - [RSA](./source/key-encryptions/RSA.ts)
30
+
31
+ ## Installation
32
+
33
+ The package is available on NPM:
34
+
35
+ ```bash
36
+ npm install @siegesailor/cryptography
37
+ ```
38
+
39
+ ### Prerequisites
40
+
41
+ Required software for this module:
42
+
43
+ - [Node.js](https://nodejs.org/): `>= 25.2.1`
44
+
45
+ ## Use as a Library
46
+
47
+ You can use it in ESM:
48
+
49
+ ```ts
50
+ import {
51
+ fastModularExponentiation,
52
+ millerRabinPrimalityTest,
53
+ euclidean,
54
+ } from "@siegesailor/cryptography";
55
+
56
+ const gcd = euclidean(614n, 513n);
57
+ const modPow = fastModularExponentiation(2n, 100n, 71n);
58
+ const isPrime = millerRabinPrimalityTest(104729n, 10);
59
+ ```
60
+
61
+ Or, you can use it in CommonJS:
62
+
63
+ ```js
64
+ const {
65
+ euclidean,
66
+ fastModularExponentiation,
67
+ millerRabinPrimalityTest,
68
+ } = require("@siegesailor/cryptography");
69
+ ```
70
+
71
+ ## Use as a CLI
72
+
73
+ ![CLI](./images/CLI.png)
74
+
75
+ Run directly with NPX:
76
+
77
+ ```bash
78
+ npx @siegesailor/cryptography
79
+ ```
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = main;
7
+ exports.prompt = prompt;
8
+ const euclidean_1 = __importDefault(require("../../algorithms/euclidean"));
9
+ const fast_modular_exponentiation_1 = __importDefault(require("../../algorithms/fast-modular-exponentiation"));
10
+ const wasm_1 = require("../../shared/algorithm/wasm");
11
+ const chalk_1 = __importDefault(require("../../shared/cli/chalk"));
12
+ const prompt_1 = require("../../shared/cli/prompt");
13
+ const constants_1 = require("../../shared/constants");
14
+ const runWASMBabyStepGiantStep = (0, wasm_1.createWASMInvoker)("baby-step-giant-step", (wasmExports, generator, base, modulo) => {
15
+ if (!wasmExports.baby_step_giant_step_i64 ||
16
+ modulo <= 1n ||
17
+ generator < 0n ||
18
+ base < 0n ||
19
+ !(0, wasm_1.fitsInI64)(generator) ||
20
+ !(0, wasm_1.fitsInI64)(base) ||
21
+ !(0, wasm_1.fitsInI64)(modulo)) {
22
+ return null;
23
+ }
24
+ const limit = modulo > 2000000n ? 2000000n : modulo;
25
+ const result = wasmExports.baby_step_giant_step_i64(generator, base, modulo, limit);
26
+ return result < 0n ? null : result;
27
+ });
28
+ function main(generator, base, modulo) {
29
+ if (modulo <= 1)
30
+ throw new Error("Given modulo must be higher than 1");
31
+ if ((0, euclidean_1.default)(generator, modulo) != BigInt(1))
32
+ throw new Error("Given generator must satisfy GCD(generator, modulo) = 1");
33
+ if ((0, euclidean_1.default)(base, modulo) != BigInt(1))
34
+ throw new Error("Given base must satisfy GCD(base, modulo) = 1");
35
+ const maybeWASMResult = runWASMBabyStepGiantStep(generator, base, modulo);
36
+ if (maybeWASMResult !== null) {
37
+ return maybeWASMResult;
38
+ }
39
+ const numberOfSteps = BigInt(Math.ceil(Math.sqrt(Number(modulo)))) + 1n;
40
+ const collision = new Map();
41
+ for (let i = numberOfSteps; i >= 1n; i--) {
42
+ const remainder = (0, fast_modular_exponentiation_1.default)(generator, i * numberOfSteps, modulo);
43
+ collision.set(remainder, i);
44
+ }
45
+ for (let j = 0n; j < numberOfSteps; j++) {
46
+ const indexCurrent = ((0, fast_modular_exponentiation_1.default)(generator, j, modulo) * base) % modulo;
47
+ const step = collision.get(indexCurrent);
48
+ if (step && step > 0n) {
49
+ const result = step * numberOfSteps - j;
50
+ if (result < modulo)
51
+ return result;
52
+ }
53
+ }
54
+ return BigInt(-1);
55
+ }
56
+ const runPrompt = (0, prompt_1.createAlgorithmPrompt)("baby-step-giant-step", async ({ ask, writeLine }) => {
57
+ writeLine(`\tgenerator^x ${constants_1.SYMBOLS.CONGRUENT} base % modulo. x = result`);
58
+ writeLine(chalk_1.default.gray(`\t92^x ${constants_1.SYMBOLS.CONGRUENT} 13 % 5. x = 3`));
59
+ const { generator, base, modulo } = await ask([
60
+ {
61
+ type: "number",
62
+ name: "generator",
63
+ message: `Enter ${chalk_1.default.italic("generator")}:`,
64
+ default: 1,
65
+ },
66
+ {
67
+ type: "number",
68
+ name: "base",
69
+ message: `Enter ${chalk_1.default.italic("base")}:`,
70
+ default: 1,
71
+ },
72
+ {
73
+ type: "number",
74
+ name: "modulo",
75
+ message: `Enter ${chalk_1.default.italic("modulo")}:`,
76
+ default: 2,
77
+ },
78
+ ]);
79
+ const result = main(BigInt(generator), BigInt(base), BigInt(modulo));
80
+ writeLine(`\t${generator}^x ${constants_1.SYMBOLS.CONGRUENT} ${base} % ${modulo}. x = ${result}`);
81
+ return {
82
+ inputs: { generator, base, modulo },
83
+ result,
84
+ };
85
+ });
86
+ async function prompt(options) {
87
+ return runPrompt(options);
88
+ }
89
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../source/algorithms/baby-step-giant-step/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const baby_step_giant_step_1 = __importDefault(require("../../algorithms/baby-step-giant-step"));
7
+ const chalk_1 = __importDefault(require("../../shared/cli/chalk"));
8
+ const constants_1 = require("../../shared/constants");
9
+ const wasm_1 = require("../../shared/testing/wasm");
10
+ describe("Finding the Discrete Log for the given numbers", () => {
11
+ test.each([
12
+ [394948, 615192, 1093427, 246298],
13
+ [92, 13, 5, 3],
14
+ [87694, 86324, 114041, 72211],
15
+ [227801, 155104, 291563, 74399],
16
+ [62712, 30084, 83437, 68793],
17
+ ])(`%p^x ${constants_1.SYMBOLS.CONGRUENT} %p % %p.\n\tx = ${chalk_1.default.greenBright("%p")}`, (generator, base, modulo, result) => {
18
+ const execute = () => {
19
+ return (0, baby_step_giant_step_1.default)(BigInt(generator), BigInt(base), BigInt(modulo));
20
+ };
21
+ expect(execute()).toEqual(BigInt(result));
22
+ (0, wasm_1.expectSameResultWithAndWithoutWASM)(execute);
23
+ });
24
+ test.each([
25
+ [1n, 1n, 1n, "Given modulo must be higher than 1"],
26
+ [4n, 1n, 8n, "Given generator must satisfy GCD(generator, modulo) = 1"],
27
+ [3n, 4n, 8n, "Given base must satisfy GCD(base, modulo) = 1"],
28
+ ])("keeps the same error with and without WASM for %p, %p, %p", (generator, base, modulo, errorMessage) => {
29
+ (0, wasm_1.expectSameErrorWithAndWithoutWASM)(() => (0, baby_step_giant_step_1.default)(generator, base, modulo), errorMessage);
30
+ });
31
+ });
32
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../source/algorithms/baby-step-giant-step/index.test.ts"],"names":[],"mappings":";;;;;AAAA,6FAAkE;AAClE,+DAAuC;AACvC,kDAA6C;AAC7C,gDAG+B;AAE/B,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,IAAI,CAAC,IAAI,CAAC;QACR,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;QACjC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACd,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;QAC7B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;QAC/B,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;KAC7B,CAAC,CACA,QAAQ,mBAAO,CAAC,SAAS,oBAAoB,eAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EACtE,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,IAAA,8BAAiB,EACtB,MAAM,CAAC,SAAS,CAAC,EACjB,MAAM,CAAC,IAAI,CAAC,EACZ,MAAM,CAAC,MAAM,CAAC,CACf,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,IAAA,yCAAkC,EAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC;QACR,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,oCAAoC,CAAC;QAClD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,yDAAyD,CAAC;QACvE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,+CAA+C,CAAC;KAC9D,CAAC,CACA,2DAA2D,EAC3D,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE;QACxC,IAAA,wCAAiC,EAC/B,GAAG,EAAE,CAAC,IAAA,8BAAiB,EAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,EAChD,YAAY,CACb,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = main;
7
+ exports.prompt = prompt;
8
+ const euclidean_1 = __importDefault(require("../../algorithms/euclidean"));
9
+ const miller_rabin_primarily_test_1 = __importDefault(require("../../algorithms/miller-rabin-primarily-test"));
10
+ const random_1 = require("../../shared/algorithm/random");
11
+ const wasm_1 = require("../../shared/algorithm/wasm");
12
+ const chalk_1 = __importDefault(require("../../shared/cli/chalk"));
13
+ const prompt_1 = require("../../shared/cli/prompt");
14
+ const runWASMBlumBlumShubNext = (0, wasm_1.createWASMInvoker)("blum-blum-shub", (wasmExports, state, modulus) => {
15
+ if (!wasmExports.blum_blum_shub_next_u64 ||
16
+ state < 0n ||
17
+ modulus <= 0n ||
18
+ !(0, wasm_1.fitsInU64)(state) ||
19
+ !(0, wasm_1.fitsInU64)(modulus)) {
20
+ return null;
21
+ }
22
+ return wasmExports.blum_blum_shub_next_u64(state, modulus);
23
+ });
24
+ function main(bits) {
25
+ if (!Number.isInteger(bits) || bits < 8) {
26
+ throw new Error("Given bits must be an integer and at least 8.");
27
+ }
28
+ const certainty = Math.max(5, Math.ceil(Math.log2(bits)));
29
+ const randomOddWithBits = (size) => {
30
+ let candidate = (0, random_1.randomBigIntBits)(size);
31
+ if ((candidate & 1n) === 0n)
32
+ candidate += 1n;
33
+ return candidate;
34
+ };
35
+ const generateBlumPrime = (size) => {
36
+ while (true) {
37
+ let candidate = randomOddWithBits(size);
38
+ if (candidate % 4n !== 3n) {
39
+ candidate += (3n - (candidate % 4n) + 4n) % 4n;
40
+ }
41
+ if ((0, miller_rabin_primarily_test_1.default)(candidate, certainty)) {
42
+ return candidate;
43
+ }
44
+ }
45
+ };
46
+ const p = generateBlumPrime(bits);
47
+ let q = generateBlumPrime(bits);
48
+ while (q === p) {
49
+ q = generateBlumPrime(bits);
50
+ }
51
+ const m = p * q;
52
+ let seed = (0, random_1.randomBigIntBetween)(2n, m - 2n);
53
+ while ((0, euclidean_1.default)(seed, m) !== 1n) {
54
+ seed = (0, random_1.randomBigIntBetween)(2n, m - 2n);
55
+ }
56
+ let result = (seed * seed) % m;
57
+ return () => {
58
+ const maybeWASMResult = runWASMBlumBlumShubNext(result, m);
59
+ if (maybeWASMResult !== null) {
60
+ result = maybeWASMResult;
61
+ return result;
62
+ }
63
+ result = (result * result) % m;
64
+ return result;
65
+ };
66
+ }
67
+ const runPrompt = (0, prompt_1.createAlgorithmPrompt)("blum-blum-shub", async ({ ask, writeLine }) => {
68
+ writeLine(`\tgenerate a 8-bit pseudo-random number x. x = result`);
69
+ writeLine(chalk_1.default.gray(`\tx is smaller or equal to ${Math.pow(2, 8) * Math.pow(2, 8)}`));
70
+ const { bits } = await ask([
71
+ {
72
+ type: "number",
73
+ name: "bits",
74
+ message: `Enter ${chalk_1.default.italic("bits")}:`,
75
+ default: 8,
76
+ },
77
+ ]);
78
+ const result = main(bits)();
79
+ writeLine(`\t${bits}-bit x = ${result}`);
80
+ return {
81
+ inputs: { bits },
82
+ result,
83
+ };
84
+ });
85
+ async function prompt(options) {
86
+ return runPrompt(options);
87
+ }
88
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../source/algorithms/blum-blum-shub/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const blum_blum_shub_1 = __importDefault(require("../../algorithms/blum-blum-shub"));
40
+ const random = __importStar(require("../../shared/algorithm/random"));
41
+ const chalk_1 = __importDefault(require("../../shared/cli/chalk"));
42
+ const wasm_1 = require("../../shared/testing/wasm");
43
+ describe("Generate pseudo random numbers", () => {
44
+ afterEach(() => {
45
+ jest.restoreAllMocks();
46
+ });
47
+ test.each([8, 12, 16])(`${chalk_1.default.greenBright("%p")}-bit random number\n\tis smaller or equal to its base-10 value`, (bits) => {
48
+ const actualResult = (0, blum_blum_shub_1.default)(bits)();
49
+ const fallbackResult = (0, wasm_1.runWithoutWASM)(() => (0, blum_blum_shub_1.default)(bits)());
50
+ expect(actualResult > 0n).toBeTruthy();
51
+ expect(fallbackResult > 0n).toBeTruthy();
52
+ });
53
+ test("produces the same next value with and without WASM when entropy is fixed", () => {
54
+ const candidateValues = [11n, 19n];
55
+ let candidateIndex = 0;
56
+ jest.spyOn(random, "randomBigIntBits").mockImplementation(() => {
57
+ const value = candidateValues[candidateIndex % candidateValues.length];
58
+ candidateIndex += 1;
59
+ return value;
60
+ });
61
+ jest.spyOn(random, "randomBigIntBetween").mockReturnValue(3n);
62
+ const execute = () => {
63
+ candidateIndex = 0;
64
+ return (0, blum_blum_shub_1.default)(8)();
65
+ };
66
+ const actualResult = execute();
67
+ expect(actualResult).toEqual(81n);
68
+ expect((0, wasm_1.runWithoutWASM)(execute)).toEqual(actualResult);
69
+ });
70
+ test.each([0, 7])("keeps the same error with and without WASM for %p bits", (bits) => {
71
+ (0, wasm_1.expectSameErrorWithAndWithoutWASM)(() => (0, blum_blum_shub_1.default)(bits), "Given bits must be an integer and at least 8.");
72
+ });
73
+ });
74
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../source/algorithms/blum-blum-shub/index.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iFAAuD;AACvD,kEAAoD;AACpD,+DAAuC;AACvC,gDAG+B;AAE/B,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CACpB,GAAG,eAAK,CAAC,WAAW,CAClB,IAAI,CACL,gEAAgE,EACjE,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,YAAY,GAAG,IAAA,wBAAY,EAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,cAAc,GAAG,IAAA,qBAAc,EAAC,GAAG,EAAE,CAAC,IAAA,wBAAY,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAElE,MAAM,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;IAC3C,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,0EAA0E,EAAE,GAAG,EAAE;QACpF,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAC7D,MAAM,KAAK,GAAG,eAAe,CAAC,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACvE,cAAc,IAAI,CAAC,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,cAAc,GAAG,CAAC,CAAC;YACnB,OAAO,IAAA,wBAAY,EAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,OAAO,EAAE,CAAC;QAE/B,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,IAAA,qBAAc,EAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACf,wDAAwD,EACxD,CAAC,IAAI,EAAE,EAAE;QACP,IAAA,wCAAiC,EAC/B,GAAG,EAAE,CAAC,IAAA,wBAAY,EAAC,IAAI,CAAC,EACxB,+CAA+C,CAChD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = main;
7
+ exports.prompt = prompt;
8
+ const euclidean_1 = __importDefault(require("../../algorithms/euclidean"));
9
+ const extended_euclidean_1 = __importDefault(require("../../algorithms/extended-euclidean"));
10
+ const wasm_1 = require("../../shared/algorithm/wasm");
11
+ const chalk_1 = __importDefault(require("../../shared/cli/chalk"));
12
+ const prompt_1 = require("../../shared/cli/prompt");
13
+ const runWASMChineseRemainder = (0, wasm_1.createWASMInvoker)("chinese-remainder", (wasmExports, remainders, modulos) => {
14
+ if (!wasmExports.chinese_remainder_i64 ||
15
+ remainders.length !== modulos.length ||
16
+ remainders.length === 0) {
17
+ return null;
18
+ }
19
+ if (remainders.some((value) => !(0, wasm_1.fitsInI64)(value)) ||
20
+ modulos.some((value) => value <= 0n || !(0, wasm_1.fitsInI64)(value))) {
21
+ return null;
22
+ }
23
+ const allocator = (0, wasm_1.createI64Allocator)(wasmExports);
24
+ allocator.reset();
25
+ const bytes = remainders.length * wasm_1.I64_BYTES;
26
+ const remaindersPtr = allocator.allocate(bytes);
27
+ const modulosPtr = allocator.allocate(bytes);
28
+ const view = allocator.view();
29
+ if (remaindersPtr === null || modulosPtr === null || !view) {
30
+ return null;
31
+ }
32
+ for (let index = 0; index < remainders.length; index++) {
33
+ view[remaindersPtr / wasm_1.I64_BYTES + index] = (0, wasm_1.normalizeI64)(remainders[index]);
34
+ view[modulosPtr / wasm_1.I64_BYTES + index] = (0, wasm_1.normalizeI64)(modulos[index]);
35
+ }
36
+ const result = wasmExports.chinese_remainder_i64(remaindersPtr, modulosPtr, remainders.length);
37
+ return result === wasm_1.MIN_I64 ? null : result;
38
+ });
39
+ function main(arrayOfBase, arrayOfModulo) {
40
+ if (arrayOfBase.length !== arrayOfModulo.length)
41
+ throw new Error("The length for the two given arrays should be the same.");
42
+ const base = arrayOfBase.map((item) => BigInt(item));
43
+ const modulo = arrayOfModulo.map((item) => BigInt(item));
44
+ const maybeWASMResult = runWASMChineseRemainder(base, modulo);
45
+ if (maybeWASMResult !== null) {
46
+ if (maybeWASMResult > BigInt(Number.MAX_SAFE_INTEGER)) {
47
+ throw new Error("CRT result exceeds Number.MAX_SAFE_INTEGER.");
48
+ }
49
+ return Number(maybeWASMResult);
50
+ }
51
+ for (let i = 0; i < modulo.length; i++) {
52
+ for (let j = i + 1; j < modulo.length; j++) {
53
+ if ((0, euclidean_1.default)(modulo[i], modulo[j]) !== 1n) {
54
+ throw new Error("All modulo values must be pairwise coprime.");
55
+ }
56
+ }
57
+ }
58
+ let modular = 1n;
59
+ modulo.forEach((item) => {
60
+ modular *= item;
61
+ });
62
+ let x = 0n;
63
+ for (let i = 0; i < base.length; i++) {
64
+ const partialModulo = modular / modulo[i];
65
+ const [gcd, inverse] = (0, extended_euclidean_1.default)(partialModulo, modulo[i]);
66
+ if (gcd !== 1n) {
67
+ throw new Error("Unable to compute modular inverse for CRT.");
68
+ }
69
+ const normalizedInverse = ((inverse % modulo[i]) + modulo[i]) % modulo[i];
70
+ x += base[i] * partialModulo * normalizedInverse;
71
+ }
72
+ const result = ((x % modular) + modular) % modular;
73
+ if (result > Number.MAX_SAFE_INTEGER) {
74
+ throw new Error("CRT result exceeds Number.MAX_SAFE_INTEGER.");
75
+ }
76
+ return Number(result);
77
+ }
78
+ const runPrompt = (0, prompt_1.createAlgorithmPrompt)("chinese-remainder", async ({ ask, writeLine }) => {
79
+ writeLine("\tx % m1 = r1, x % m2 = r2 ... x = result");
80
+ writeLine(chalk_1.default.gray("\tx % 11 = 2, x % 19 = 1, x % 37 = 2. x = 2851"));
81
+ const { base, modulo } = await ask([
82
+ {
83
+ type: "input",
84
+ name: "base",
85
+ message: `Enter ${chalk_1.default.italic("remainders")} (comma-separated):`,
86
+ default: "2,1,2",
87
+ },
88
+ {
89
+ type: "input",
90
+ name: "modulo",
91
+ message: `Enter ${chalk_1.default.italic("modulos")} (comma-separated):`,
92
+ default: "11,19,37",
93
+ },
94
+ ]);
95
+ const remainders = String(base)
96
+ .split(",")
97
+ .map((item) => Number(item.trim()));
98
+ const modulos = String(modulo)
99
+ .split(",")
100
+ .map((item) => Number(item.trim()));
101
+ const result = main(remainders, modulos);
102
+ writeLine(`\tResult x = ${result}`);
103
+ return {
104
+ inputs: { remainders, modulos },
105
+ result,
106
+ };
107
+ });
108
+ async function prompt(options) {
109
+ return runPrompt(options);
110
+ }
111
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../source/algorithms/chinese-remainder/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const chinese_remainder_1 = __importDefault(require("../../algorithms/chinese-remainder"));
7
+ const chalk_1 = __importDefault(require("../../shared/cli/chalk"));
8
+ const wasm_1 = require("../../shared/testing/wasm");
9
+ describe("Finding a number by the product of different remainders", () => {
10
+ test.each([
11
+ [[2, 1, 2], [11, 19, 37], 2851],
12
+ [[2, 1], [11, 19], 134],
13
+ [[50, 40, 30], [3, 5, 7], 65],
14
+ [[128, 87, 921], [13, 17, 127], 14129],
15
+ [[981237, 1238891], [218, 12839], 1469993],
16
+ ])(`%p as integers and %p as modulo\n\tnumber is ${chalk_1.default.greenBright("%p")}`, (arrayOfBase, arrayOfModulo, result) => {
17
+ const execute = () => (0, chinese_remainder_1.default)(arrayOfBase, arrayOfModulo);
18
+ expect(execute()).toEqual(result);
19
+ (0, wasm_1.expectSameResultWithAndWithoutWASM)(execute);
20
+ });
21
+ test.each([
22
+ [[1, 2], [3], "The length for the two given arrays should be the same."],
23
+ [[1, 2], [4, 6], "All modulo values must be pairwise coprime."],
24
+ ])("keeps the same error with and without WASM for %p and %p", (remainders, modulos, errorMessage) => {
25
+ (0, wasm_1.expectSameErrorWithAndWithoutWASM)(() => (0, chinese_remainder_1.default)(remainders, modulos), errorMessage);
26
+ });
27
+ });
28
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../source/algorithms/chinese-remainder/index.test.ts"],"names":[],"mappings":";;;;;AAAA,uFAA8D;AAC9D,+DAAuC;AACvC,gDAG+B;AAE/B,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACvE,IAAI,CAAC,IAAI,CAAC;QACR,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;QAC/B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC;QACvB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7B,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC;QACtC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC;KAC3C,CAAC,CACA,gDAAgD,eAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EACzE,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAA,2BAAgB,EAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAEnE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClC,IAAA,yCAAkC,EAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC;QACR,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,yDAAyD,CAAC;QACxE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,6CAA6C,CAAC;KAChE,CAAC,CACA,0DAA0D,EAC1D,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE;QACpC,IAAA,wCAAiC,EAC/B,GAAG,EAAE,CAAC,IAAA,2BAAgB,EAAC,UAAU,EAAE,OAAO,CAAC,EAC3C,YAAY,CACb,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = main;
7
+ exports.prompt = prompt;
8
+ const wasm_1 = require("../../shared/algorithm/wasm");
9
+ const chalk_1 = __importDefault(require("../../shared/cli/chalk"));
10
+ const prompt_1 = require("../../shared/cli/prompt");
11
+ const runWASMGcd = (0, wasm_1.createWASMInvoker)("euclidean", (wasmExports, left, right) => {
12
+ if (!wasmExports.gcd_u64 ||
13
+ left < 0n ||
14
+ right < 0n ||
15
+ !(0, wasm_1.fitsInU64)(left) ||
16
+ !(0, wasm_1.fitsInU64)(right)) {
17
+ return null;
18
+ }
19
+ return wasmExports.gcd_u64(left, right);
20
+ });
21
+ function main(left, right) {
22
+ const wasmResult = runWASMGcd(left, right);
23
+ if (wasmResult !== null) {
24
+ return wasmResult;
25
+ }
26
+ while (right !== BigInt(0)) {
27
+ const cache = right;
28
+ right = left % right;
29
+ left = cache;
30
+ }
31
+ return left;
32
+ }
33
+ const runPrompt = (0, prompt_1.createAlgorithmPrompt)("euclidean", async ({ ask, writeLine }) => {
34
+ writeLine("\tGCD(left, right) = result");
35
+ writeLine(chalk_1.default.gray("\tGCD(614, 513) = 1"));
36
+ const { left, right } = await ask([
37
+ {
38
+ type: "number",
39
+ name: "left",
40
+ message: `Enter ${chalk_1.default.italic("left")}:`,
41
+ default: 1,
42
+ },
43
+ {
44
+ type: "number",
45
+ name: "right",
46
+ message: `Enter ${chalk_1.default.italic("right")}:`,
47
+ default: 1,
48
+ },
49
+ ]);
50
+ const result = main(BigInt(left), BigInt(right));
51
+ writeLine(`\tGCD(${left}, ${right}) = ${result}`);
52
+ return {
53
+ inputs: { left, right },
54
+ result,
55
+ };
56
+ });
57
+ async function prompt(options) {
58
+ return runPrompt(options);
59
+ }
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../source/algorithms/euclidean/index.ts"],"names":[],"mappings":";;;;;AAwBA,uBAYC;AAiCD,wBAEC;AAvED,kDAAuE;AACvE,+DAAuC;AACvC,gDAG6B;AAE7B,MAAM,UAAU,GAAG,IAAA,wBAAiB,EAClC,WAAW,EACX,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAC3B,IACE,CAAC,WAAW,CAAC,OAAO;QACpB,IAAI,GAAG,EAAE;QACT,KAAK,GAAG,EAAE;QACV,CAAC,IAAA,gBAAS,EAAC,IAAI,CAAC;QAChB,CAAC,IAAA,gBAAS,EAAC,KAAK,CAAC,EACjB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1C,CAAC,CACF,CAAC;AAEF,SAAwB,IAAI,CAAC,IAAY,EAAE,KAAa;IACtD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC;QACpB,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;QACrB,IAAI,GAAG,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,SAAS,GAAG,IAAA,8BAAqB,EACrC,WAAW,EACX,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;IAC3B,SAAS,CAAC,6BAA6B,CAAC,CAAC;IACzC,SAAS,CAAC,eAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAE7C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAkC;QACjE;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,SAAS,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG;YACzC,OAAO,EAAE,CAAC;SACX;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,SAAS,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG;YAC1C,OAAO,EAAE,CAAC;SACX;KACF,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,SAAS,CAAC,SAAS,IAAI,KAAK,KAAK,OAAO,MAAM,EAAE,CAAC,CAAC;IAElD,OAAO;QACL,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACvB,MAAM;KACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEK,KAAK,UAAU,MAAM,CAAC,OAAwB;IACnD,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC"}