From 02deb397d2a5659247acd26aae1b4c80131e396e Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 12:07:51 +0900 Subject: [PATCH 01/16] Removed .dist folder from git --- .dist/npm/CHANGELOG.md | 170 ---------- .dist/npm/CLVMObject.d.ts | 22 -- .dist/npm/CLVMObject.js | 48 --- .dist/npm/EvalError.d.ts | 7 - .dist/npm/EvalError.js | 11 - .dist/npm/LICENSE | 21 -- .dist/npm/README.md | 70 ---- .dist/npm/SExp.d.ts | 33 -- .dist/npm/SExp.js | 257 --------------- .dist/npm/__bls_signatures__.d.ts | 19 -- .dist/npm/__bls_signatures__.js | 117 ------- .dist/npm/__debug__.d.ts | 1 - .dist/npm/__debug__.js | 17 - .dist/npm/__python_types__.d.ts | 19 -- .dist/npm/__python_types__.js | 4 - .dist/npm/__type_compatibility__.d.ts | 74 ----- .dist/npm/__type_compatibility__.js | 377 ---------------------- .dist/npm/as_javascript.d.ts | 7 - .dist/npm/as_javascript.js | 59 ---- .dist/npm/browser/blsjs.wasm | Bin 246788 -> 0 bytes .dist/npm/browser/index.js | 1 - .dist/npm/casts.d.ts | 9 - .dist/npm/casts.js | 47 --- .dist/npm/core_ops.d.ts | 8 - .dist/npm/core_ops.js | 66 ---- .dist/npm/costs.d.ts | 51 --- .dist/npm/costs.js | 55 ---- .dist/npm/index.d.ts | 19 -- .dist/npm/index.js | 32 -- .dist/npm/initialize.d.ts | 4 - .dist/npm/initialize.js | 22 -- .dist/npm/more_ops.d.ts | 32 -- .dist/npm/more_ops.js | 438 -------------------------- .dist/npm/op_utils.d.ts | 4 - .dist/npm/op_utils.js | 19 -- .dist/npm/operators.d.ts | 113 ------- .dist/npm/operators.js | 309 ------------------ .dist/npm/package.json | 48 --- .dist/npm/run_program.d.ts | 13 - .dist/npm/run_program.js | 167 ---------- .dist/npm/serialize.d.ts | 9 - .dist/npm/serialize.js | 211 ------------- .gitignore | 1 + CHANGELOG.md | 6 + 44 files changed, 7 insertions(+), 3010 deletions(-) delete mode 100644 .dist/npm/CHANGELOG.md delete mode 100644 .dist/npm/CLVMObject.d.ts delete mode 100644 .dist/npm/CLVMObject.js delete mode 100644 .dist/npm/EvalError.d.ts delete mode 100644 .dist/npm/EvalError.js delete mode 100644 .dist/npm/LICENSE delete mode 100644 .dist/npm/README.md delete mode 100644 .dist/npm/SExp.d.ts delete mode 100644 .dist/npm/SExp.js delete mode 100644 .dist/npm/__bls_signatures__.d.ts delete mode 100644 .dist/npm/__bls_signatures__.js delete mode 100644 .dist/npm/__debug__.d.ts delete mode 100644 .dist/npm/__debug__.js delete mode 100644 .dist/npm/__python_types__.d.ts delete mode 100644 .dist/npm/__python_types__.js delete mode 100644 .dist/npm/__type_compatibility__.d.ts delete mode 100644 .dist/npm/__type_compatibility__.js delete mode 100644 .dist/npm/as_javascript.d.ts delete mode 100644 .dist/npm/as_javascript.js delete mode 100644 .dist/npm/browser/blsjs.wasm delete mode 100644 .dist/npm/browser/index.js delete mode 100644 .dist/npm/casts.d.ts delete mode 100644 .dist/npm/casts.js delete mode 100644 .dist/npm/core_ops.d.ts delete mode 100644 .dist/npm/core_ops.js delete mode 100644 .dist/npm/costs.d.ts delete mode 100644 .dist/npm/costs.js delete mode 100644 .dist/npm/index.d.ts delete mode 100644 .dist/npm/index.js delete mode 100644 .dist/npm/initialize.d.ts delete mode 100644 .dist/npm/initialize.js delete mode 100644 .dist/npm/more_ops.d.ts delete mode 100644 .dist/npm/more_ops.js delete mode 100644 .dist/npm/op_utils.d.ts delete mode 100644 .dist/npm/op_utils.js delete mode 100644 .dist/npm/operators.d.ts delete mode 100644 .dist/npm/operators.js delete mode 100644 .dist/npm/package.json delete mode 100644 .dist/npm/run_program.d.ts delete mode 100644 .dist/npm/run_program.js delete mode 100644 .dist/npm/serialize.d.ts delete mode 100644 .dist/npm/serialize.js diff --git a/.dist/npm/CHANGELOG.md b/.dist/npm/CHANGELOG.md deleted file mode 100644 index 65aacf4..0000000 --- a/.dist/npm/CHANGELOG.md +++ /dev/null @@ -1,170 +0,0 @@ -# Changelog - -## [0.0.19] - -**There are 2 breaking changes.** -- Changed `OperatorDict` arguments format. -Past: `OperatorDict(atom_op_function_map, quote_atom, apply_atom, unknown_op_handler)` -New: `OperatorDict(atom_op_function_map, option)` -where `option` is `{quote_atom: Bytes, apply_atom: Bytes, unknown_op_handler: typeof default_unknown_op}` - -- When you initialize `Bytes` using constructor like `new Byte(data)`, `data` is not copied but just stored and keeps reference of `data`, for performance enhancement. -In javascript, byte copy by `TypedArray` constructor is not sufficiently fast. -So I left user an option how to initialize `Bytes` instance. Data copy, or Store reference. -If you want to copy data and cut reference apart, then please get `Bytes` instance by `Bytes.from` factory function. - -**Resolved a deep tree performance issue** -Before this version, `yarn test serialize_test --testNamePattern=test_very_deep_tree` was really slow. It took around 80 seconds to complete test. -At this version, I've managed to improve test complete time to `79s` -> `2s` by pre-allocating buffer memory on `Stream` instance. - -### Changed -- Changed `OperatorDict` arguments format. -- When you initialize `Bytes` using constructor like `new Byte(data)`, `data` is not copied but just stored and keeps reference of `data`, for performance enhancement. -- Greatly improved overall performance by pre-allocating buffer memory on `Stream` instance. -- Improved performance of `Bytes::equal_to`. -- Changed parameter type of `SExp::equal_to` from `CastableType` to `any` -- Replaced use of `instanceof` operator for non-native types. -- Updated bls-signatures version to 0.2.1-beta.1 -- Improved `Bytes::concat` performance. -- Reorganized dist folder -### Fixed -- Fixed an issue where `SExp.to()` did not work the same as python's clvm. -- Fixed an issue where Bytes-SExp comparison like `b('aaa').equal_to(SExp.null())` did not work. -- Fixed an issue where `OperatorDict` did not throw Error when either `quote` or `apply` is not specified. -### Added -- Added `list()` function working similar to Python's `list()`. -- Added `Bytes::repeat` function. - -## [0.0.18] -### Changed -- Fixed an issue where `int_to_bytes` did not work as expected if the argument is a negative number. -- Changed `Bytes::toString()` to return python's `bytes.__repr__` style string. - -## [0.0.17] -### Changed -- Updated `jscrypto` version to 1.0.2 - -## [0.0.16] -### Added -- Added license information to README.md -### Fixed -- Fixed a bug in `sexp_from_stream` -- Fixed incorrect use of `int_to_bytes` - -## [0.0.15] -### Fixed -- Fixed a bug in `pre_build.js` - -## [0.0.14] -### Changed -- Changed new line style for files in `dist/` from windows-style(CR) to linux-style(LF). -### Removed -- Removed `WordArray32` from possible argument of `Bytes.from`. -### Added -- Added `Bytes.SHA256()`. - -## [0.0.13] -### Changed -- `Bytes.from()` now accepts an array of number. -### Fixed -- Fixed an issue where `int_to_bytes` returns value incompatible with clvm in python. -- Fixed a minor issue - -## [0.0.12] -### Fixed -- Don't remove leading '00' or 'ff' when serializing SExp to hex string. -- Fixed an issue where `SExp.to(0)` is converted to `SExp(0x00)` where `SExp(0x80)` is expected. -- Fixed an issue where it raises an Error when executing `Bytes::equal_to(None)`. -- Fixed a minor issue - -## [0.0.11] -### Changed -- Made `EvalError::_sexp` public. - -## [0.0.10] -### Added -- Added `h()` helper function which equals to `Bytes.from(, "hex")` -### Fixed -- Removed type-guard from `SExp::listp()` -- Removed `SExpAsAtom` type and `SExpAsPair` type as they seem not working. - - -## [0.0.9] -### Added -- Added `Bytes::hex()` which is an alias of `Bytes::toString()` -- Added `Bytes::decode()` -- Added `Bytes::startswith()` and `Bytes::endswith()` -- Added `SExpAsAtom` type and `SExpAsPair` type. -- Added hex string support to `b()`. In `b("0xaa", "hex")`, `0xaa` is now parsed as hex string. -### Fixed -- Fixed value of `SExp.TRUE` and `SExp.FALSE` - -## [0.0.8] -### Added -- Added `b()` helper function which equals to `Bytes.from(, "utf8")` -- Added `isTuple`, `isList` functions. - -## [0.0.7] -### Changed -- Made return type of `as_javascript()` explicit -- Updated `CastableType` - -## [0.0.6] -### Fixed -- Fixed an issue where `SExp::as_javascript()` does not return expected value. -- Fixed an issue where `SExp.to()` raises unexpected Error. -- Fixed incorrect function name `__repl__` to `__repr__` -### Changed -- Removed '0x' prefix from results of `SExp::__repr__()` - -## [0.0.5] -### Fixed -- Fixed an issue where `SExp.to()` falls in infinite loop. - -## [0.0.4] -### Changed -- Changed source of `bls-signatures` to `@chiamine/bls-signatures` - - When installing from previous `Chia-Mine/bls-signatures#npm`, the npm module version is too old or unstable. - Sometimes it installed the latest commit and another time installed old cache. - I decided to install the module not from GitHub branch but official npm registry for stability. -- Updated README - -### Fixed -- Fixed various eslint errors - -## [0.0.3] -### Added -- Added `to_sexp_f` export to index.ts/index.js - -## [0.0.2] -### Changed -- Change tuple type `Tuple2` -> `Tuple`. - -## [0.0.1] - 2021-06-16 -### Fixed -- Fixed various bugs - -## [0.0.0] - 2021-06-15 -Initial (beta) release. - - -[0.0.19]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.18...v0.0.19 -[0.0.18]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.17...v0.0.18 -[0.0.17]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.16...v0.0.17 -[0.0.16]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.15...v0.0.16 -[0.0.15]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.14...v0.0.15 -[0.0.14]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.13...v0.0.14 -[0.0.13]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.12...v0.0.13 -[0.0.12]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.11...v0.0.12 -[0.0.11]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.10...v0.0.11 -[0.0.10]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.9...v0.0.10 -[0.0.9]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.8...v0.0.9 -[0.0.8]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.7...v0.0.8 -[0.0.7]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.6...v0.0.7 -[0.0.6]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.5...v0.0.6 -[0.0.5]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.4...v0.0.5 -[0.0.4]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.3...v0.0.4 -[0.0.3]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.2...v0.0.3 -[0.0.2]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.1...v0.0.2 -[0.0.1]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.0...v0.0.1 -[0.0.0]: https://github.com/Chia-Mine/clvm-js/releases/tag/v0.0.0 diff --git a/.dist/npm/CLVMObject.d.ts b/.dist/npm/CLVMObject.d.ts deleted file mode 100644 index 7f3f206..0000000 --- a/.dist/npm/CLVMObject.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { None, Optional } from "./__python_types__"; -import { Bytes, Tuple } from "./__type_compatibility__"; -export declare type CLVMType = { - atom: Optional; - pair: Optional>; -}; -export declare type Atom = { - atom: Bytes; - pair: None; -}; -export declare type Cons = { - atom: None; - pair: Tuple; -}; -export declare class CLVMObject implements CLVMType { - atom: Optional; - pair: Optional>; - constructor(v: any); -} -export declare function isAtom(obj: CLVMType): obj is Atom; -export declare function isCons(obj: CLVMType): obj is Cons; -export declare function isCLVMObject(v: any): v is CLVMObject; diff --git a/.dist/npm/CLVMObject.js b/.dist/npm/CLVMObject.js deleted file mode 100644 index 81f15c4..0000000 --- a/.dist/npm/CLVMObject.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isCLVMObject = exports.isCons = exports.isAtom = exports.CLVMObject = void 0; -const __python_types__1 = require("./__python_types__"); -const __type_compatibility__1 = require("./__type_compatibility__"); -const EvalError_1 = require("./EvalError"); -/* - This class implements the CLVM Object protocol in the simplest possible way, - by just having an "atom" and a "pair" field - */ -class CLVMObject { - constructor(v) { - this.atom = __python_types__1.None; - // this is always a 2-tuple of an object implementing the CLVM object protocol. - this.pair = __python_types__1.None; - if (isCLVMObject(v)) { - this.atom = v.atom; - this.pair = v.pair; - } - else if (__type_compatibility__1.isTuple(v)) { - this.pair = v; - this.atom = __python_types__1.None; - } - else { - this.atom = v; - this.pair = __python_types__1.None; - } - } -} -exports.CLVMObject = CLVMObject; -function isAtom(obj) { - if ((obj.atom && obj.pair) || (!obj.atom && !obj.pair)) { - throw new EvalError_1.EvalError("Invalid clvm", obj); - } - return Boolean(obj.atom && !obj.pair); -} -exports.isAtom = isAtom; -function isCons(obj) { - if ((obj.atom && obj.pair) || (!obj.atom && !obj.pair)) { - throw new EvalError_1.EvalError("Invalid clvm", obj); - } - return Boolean((!obj.atom && obj.pair)); -} -exports.isCons = isCons; -function isCLVMObject(v) { - return v && typeof v.atom !== "undefined" && typeof v.pair !== "undefined"; -} -exports.isCLVMObject = isCLVMObject; diff --git a/.dist/npm/EvalError.d.ts b/.dist/npm/EvalError.d.ts deleted file mode 100644 index 0b6ce76..0000000 --- a/.dist/npm/EvalError.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { str } from "./__python_types__"; -import type { CLVMObject } from "./CLVMObject"; -export declare class EvalError extends Error { - _sexp?: CLVMObject; - name: string; - constructor(message: str, sexp: CLVMObject); -} diff --git a/.dist/npm/EvalError.js b/.dist/npm/EvalError.js deleted file mode 100644 index 7117bc0..0000000 --- a/.dist/npm/EvalError.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.EvalError = void 0; -class EvalError extends Error { - constructor(message, sexp) { - super(message); - this.name = "EvalError"; - this._sexp = sexp; - } -} -exports.EvalError = EvalError; diff --git a/.dist/npm/LICENSE b/.dist/npm/LICENSE deleted file mode 100644 index cdc5243..0000000 --- a/.dist/npm/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2019 Admin ChiaMineJP - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/.dist/npm/README.md b/.dist/npm/README.md deleted file mode 100644 index 7ee6bf4..0000000 --- a/.dist/npm/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# clvm - -Javascript implementation of CLVM (Chia Lisp VM) -Still Work in progress.(Untested) - -**v0.x.x is test purpose only!** -Please report bugs to https://github.com/Chia-Mine/clvm-js/issues - -## Install -```shell -npm install clvm -# or -yarn add clvm -``` - -## Example -```javascript -// in nodejs context -async function main(){ - var clvm = require("clvm"); - - // 'clvm.initialization()' here is not required - // if you're so sure it never calls 'pubkey_for_exp' or 'point_add' operation. - // When one of those operations is called without prior 'clvm.initialize()' - // it will raise an Error. - // If it is unknown whether 'pubkey_for_exp' or 'point_add' will be called, - // then put 'await clvm.initialize()' for safety. - // I know this 'await clvm.initialize()' makes code asynchronous - // and really impacts on code architecture. - // This is because 'clvm' relys on a wasm of 'bls-signatures', - // which requires asynchronous loading. - await clvm.initialize(); - - const {SExp, OPERATOR_LOOKUP, KEYWORD_TO_ATOM} = clvm; - const v1 = OPERATOR_LOOKUP(KEYWORD_TO_ATOM["+"], SExp.to([3,4,5]))[1]; - const v2 = SExp.to(12); - const ok = v1.equal_to(v2); - console.log(`ok: ${ok}`); // 'ok: true' -} - -main().catch(e => console.error(e)); -``` - -## Use in browser -If you'd like to run some javascript code which depends on `clvm` on browser, -you need to put `blsjs.wasm` to the same directory as the code who loads `clvm`. - -
-├── ...
-├── main.js      # js file which clvm is compiled into
-└── blsjs.wasm   # copy it from npm_modules/clvm/dist/browser/blsjs.wasm
-
- -**Note1**: Don't forget to wait `clvm.initialize()` if you are not sure whether `pubkey_for_exp`/`point_add` will be called. -**Note2**: If you're really sure that `pubkey_for_exp`/`point_add` will never be called, then you can opt out `blsjs.wasm` and `await clvm.initialize()`. -If so, you can make your code fully synchronous. - - - -## clvm license -`clvm-js` is based on [clvm](https://github.com/Chia-Network/clvm) with the -[Apache license 2.0](https://github.com/Chia-Network/clvm/blob/main/LICENSE) - -## bls-signatures license -[bls-signatures](https://github.com/Chia-Network/bls-signatures) is used under the -[Apache license 2.0](https://github.com/Chia-Network/bls-signatures/blob/main/LICENSE) - -## jscrypto license -[jscrypto](https://github.com/Hinaser/jscrypto) is used under the -[MIT license](https://github.com/Hinaser/jscrypto/blob/master/LICENSE) diff --git a/.dist/npm/SExp.d.ts b/.dist/npm/SExp.d.ts deleted file mode 100644 index aa3161b..0000000 --- a/.dist/npm/SExp.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { G1Element } from "@chiamine/bls-signatures"; -import { int, None, Optional, str } from "./__python_types__"; -import { CLVMObject, CLVMType } from "./CLVMObject"; -import { Bytes, Tuple } from "./__type_compatibility__"; -export declare type CastableType = SExp | CLVMType | Bytes | str | int | None | G1Element | CastableType[] | Tuple; -export declare function looks_like_clvm_object(o: any): o is CLVMObject; -export declare function convert_atom_to_bytes(v: any): Bytes; -export declare function to_sexp_type(value: CastableType): CLVMObject; -export declare class SExp implements CLVMType { - atom: Optional; - pair: Optional>; - static readonly TRUE: SExp; - static readonly FALSE: SExp; - static readonly __NULL__: SExp; - static to(v: CastableType): SExp; - static null(): SExp; - constructor(v: CLVMObject); - as_pair(): Tuple | None; - listp(): boolean; - nullp(): boolean; - as_int(): number; - as_bin(): Bytes; - cons(right: any): SExp; - first(): SExp; - rest(): SExp; - as_iter(): Generator; - equal_to(other: any): boolean; - list_len(): number; - as_javascript(): import("./as_javascript").TToJavascript; - toString(): string; - __repr__(): string; -} -export declare function isSExp(v: any): v is SExp; diff --git a/.dist/npm/SExp.js b/.dist/npm/SExp.js deleted file mode 100644 index c45e514..0000000 --- a/.dist/npm/SExp.js +++ /dev/null @@ -1,257 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isSExp = exports.SExp = exports.to_sexp_type = exports.convert_atom_to_bytes = exports.looks_like_clvm_object = void 0; -const __python_types__1 = require("./__python_types__"); -const CLVMObject_1 = require("./CLVMObject"); -const __type_compatibility__1 = require("./__type_compatibility__"); -const casts_1 = require("./casts"); -const serialize_1 = require("./serialize"); -const as_javascript_1 = require("./as_javascript"); -const EvalError_1 = require("./EvalError"); -function looks_like_clvm_object(o) { - if (!o || typeof o !== "object") { - return false; - } - return Boolean("atom" in o && "pair" in o); -} -exports.looks_like_clvm_object = looks_like_clvm_object; -// this function recognizes some common types and turns them into plain bytes -function convert_atom_to_bytes(v) { - if (__type_compatibility__1.isBytes(v)) { - return v; - } - else if (typeof v === "string") { - return __type_compatibility__1.Bytes.from(v, "utf8"); - } - else if (typeof v === "number") { - return casts_1.int_to_bytes(v); - } - else if (typeof v === "boolean") { // Tips. In Python, isinstance(True, int) == True. - return casts_1.int_to_bytes(v ? 1 : 0); - } - else if (v === __python_types__1.None || !v) { - return __type_compatibility__1.Bytes.NULL; - } - else if (__type_compatibility__1.isIterable(v)) { - if (v.length > 0) { - throw new Error(`can't cast ${JSON.stringify(v)} to bytes`); - } - return __type_compatibility__1.Bytes.NULL; - } - else if (typeof v.serialize === "function") { - return __type_compatibility__1.Bytes.from(v, "G1Element"); - } - throw new Error(`can't cast ${JSON.stringify(v)} to bytes`); -} -exports.convert_atom_to_bytes = convert_atom_to_bytes; -const op_convert = 0; -const op_set_left = 1; -const op_set_right = 2; -const op_prepend_list = 3; -function to_sexp_type(value) { - let v = value; - const stack = [v]; - const ops = [__type_compatibility__1.t(0, __python_types__1.None)]; - while (ops.length) { - const item = ops.pop(); - const op = item[0]; - let targetIndex = item[1]; - // convert value - if (op === op_convert) { - if (looks_like_clvm_object(stack[stack.length - 1])) { - continue; - } - v = stack.pop(); - if (__type_compatibility__1.isTuple(v)) { - if (v.length !== 2) { - throw new Error(`can't cast tuple of size ${v.length}`); - } - const [left, right] = v; - targetIndex = stack.length; - stack.push(new CLVMObject_1.CLVMObject(__type_compatibility__1.t(left, right))); - if (!looks_like_clvm_object(right)) { - stack.push(right); - ops.push(__type_compatibility__1.t(2, targetIndex)); // set right - ops.push(__type_compatibility__1.t(0, __python_types__1.None)); // convert - } - if (!looks_like_clvm_object(left)) { - stack.push(left); - ops.push(__type_compatibility__1.t(1, targetIndex)); - ops.push(__type_compatibility__1.t(0, __python_types__1.None)); - } - continue; - } - else if (Array.isArray(v) /* && !(v instance of Tuple) */) { - targetIndex = stack.length; - stack.push(new CLVMObject_1.CLVMObject(__type_compatibility__1.Bytes.NULL)); - for (const _ of v) { - stack.push(_); - ops.push(__type_compatibility__1.t(3, targetIndex)); // prepend list - // we only need to convert if it's not already the right type - if (!looks_like_clvm_object(_)) { - ops.push(__type_compatibility__1.t(0, __python_types__1.None)); // convert - } - } - continue; - } - stack.push(new CLVMObject_1.CLVMObject(convert_atom_to_bytes(v))); - continue; - } - if (targetIndex === null) { - throw new Error("Invalid target. target is null"); - } - if (op === op_set_left) { // set left - stack[targetIndex].pair = __type_compatibility__1.t(new CLVMObject_1.CLVMObject(stack.pop()), stack[targetIndex].pair[1]); - } - else if (op === op_set_right) { // set right - stack[targetIndex].pair = __type_compatibility__1.t(stack[targetIndex].pair[0], new CLVMObject_1.CLVMObject(stack.pop())); - } - else if (op === op_prepend_list) { // prepend list - stack[targetIndex] = new CLVMObject_1.CLVMObject(__type_compatibility__1.t(stack.pop(), stack[targetIndex])); - } - } - // there's exactly one item left at this point - if (stack.length !== 1) { - throw new Error("internal error"); - } - // stack[0] implements the clvm object protocol and can be wrapped by an SExp - return stack[0]; -} -exports.to_sexp_type = to_sexp_type; -/* - SExp provides higher level API on top of any object implementing the CLVM - object protocol. - The tree of values is not a tree of SExp objects, it's a tree of CLVMObject - like objects. SExp simply wraps them to privide a uniform view of any - underlying conforming tree structure. - - The CLVM object protocol (concept) exposes two attributes: - 1. "atom" which is either None or bytes - 2. "pair" which is either None or a tuple of exactly two elements. Both - elements implementing the CLVM object protocol. - Exactly one of "atom" and "pair" must be None. - */ -class SExp { - constructor(v) { - this.atom = __python_types__1.None; - // this is always a 2-tuple of an object implementing the CLVM object protocol. - this.pair = __python_types__1.None; - this.atom = v.atom; - this.pair = v.pair; - } - static to(v) { - if (isSExp(v)) { - return v; - } - if (looks_like_clvm_object(v)) { - return new SExp(v); - } - // this will lazily convert elements - return new SExp(to_sexp_type(v)); - } - static null() { - return SExp.__NULL__; - } - as_pair() { - const pair = this.pair; - if (pair === __python_types__1.None) { - return pair; - } - return __type_compatibility__1.t(new SExp(pair[0]), new SExp(pair[1])); - } - listp() { - return this.pair !== __python_types__1.None; - } - nullp() { - return this.atom !== __python_types__1.None && this.atom.raw().length === 0; - } - as_int() { - return casts_1.int_from_bytes(this.atom); - } - as_bin() { - const f = new __type_compatibility__1.Stream(); - serialize_1.sexp_to_stream(this, f); - return f.getValue(); - } - cons(right) { - return SExp.to(__type_compatibility__1.t(this, right)); - } - first() { - const pair = this.pair; - if (pair) { - return new SExp(pair[0]); - } - throw new EvalError_1.EvalError("first of non-cons", this); - } - rest() { - const pair = this.pair; - if (pair) { - return new SExp(pair[1]); - } - throw new EvalError_1.EvalError("rest of non-cons", this); - } - *as_iter() { - let v = this; - while (!v.nullp()) { - yield v.first(); - v = v.rest(); - } - } - equal_to(other /* CastableType */) { - try { - other = SExp.to(other); - const to_compare_stack = [__type_compatibility__1.t(this, other)]; - while (to_compare_stack.length) { - const [s1, s2] = to_compare_stack.pop(); - const p1 = s1.as_pair(); - if (p1) { - const p2 = s2.as_pair(); - if (p2) { - to_compare_stack.push(__type_compatibility__1.t(p1[0], p2[0])); - to_compare_stack.push(__type_compatibility__1.t(p1[1], p2[1])); - } - else { - return false; - } - } - else if (s2.as_pair() || !(s1.atom && s2.atom && s1.atom.equal_to(s2.atom))) { - return false; - } - } - return true; - } - catch (e) { - return false; - } - } - list_len() { - let v = this; - let size = 0; - while (v.listp()) { - size += 1; - v = v.rest(); - } - return size; - } - as_javascript() { - return as_javascript_1.as_javascript(this); - } - toString() { - return this.as_bin().hex(); - } - __repr__() { - return `SExp(${this.as_bin().hex()})`; - } -} -exports.SExp = SExp; -SExp.TRUE = new SExp(new CLVMObject_1.CLVMObject(__type_compatibility__1.Bytes.from("0x01", "hex"))); -SExp.FALSE = new SExp(new CLVMObject_1.CLVMObject(__type_compatibility__1.Bytes.NULL)); -SExp.__NULL__ = new SExp(new CLVMObject_1.CLVMObject(__type_compatibility__1.Bytes.NULL)); -function isSExp(v) { - return v && typeof v.atom !== "undefined" - && typeof v.pair !== "undefined" - && typeof v.first === "function" - && typeof v.rest === "function" - && typeof v.cons === "function"; -} -exports.isSExp = isSExp; diff --git a/.dist/npm/__bls_signatures__.d.ts b/.dist/npm/__bls_signatures__.d.ts deleted file mode 100644 index c5314a6..0000000 --- a/.dist/npm/__bls_signatures__.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { G1Element as G1ElementType, ModuleInstance } from "@chiamine/bls-signatures"; -export declare let BLS: ModuleInstance | undefined; -export declare let loadPromise: Promise | undefined; -/** - * Load BLS Module instance. - * This function must be called an awaited on program start up. - */ -export declare function initializeBLS(): Promise; -/** - * This function must be called after `initializeBLS()` is done. - * Calling `await initializeBLS()` on program startup is library user's responsibility. - * - * This is used for synchronous code execution. - * Within this library, this is always called to get BLS module to keep code synchronous. - */ -export declare function getBLSModule(): ModuleInstance; -export declare function G1Element_from_bytes(bytes: Uint8Array): G1ElementType; -export declare function assert_G1Element_valid(bytes: Uint8Array): void; -export declare function G1Element_add(g1Element1: G1ElementType, g1Element2: G1ElementType): G1ElementType; diff --git a/.dist/npm/__bls_signatures__.js b/.dist/npm/__bls_signatures__.js deleted file mode 100644 index b2ec252..0000000 --- a/.dist/npm/__bls_signatures__.js +++ /dev/null @@ -1,117 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.G1Element_add = exports.assert_G1Element_valid = exports.G1Element_from_bytes = exports.getBLSModule = exports.initializeBLS = exports.loadPromise = exports.BLS = void 0; -const blsLoader = require("@chiamine/bls-signatures"); -/** - * Load BLS Module instance. - * This function must be called an awaited on program start up. - */ -function initializeBLS() { - return __awaiter(this, void 0, void 0, function* () { - if (exports.BLS) { - return exports.BLS; - } - else if (exports.loadPromise) { - return exports.loadPromise; - } - return exports.loadPromise = new Promise((resolve, reject) => { - if (exports.BLS) { - exports.loadPromise = undefined; - return resolve(exports.BLS); - } - blsLoader().then((instance) => { - if (!instance) { - return reject(); - } - exports.loadPromise = undefined; - return resolve(exports.BLS = instance); - }).catch(e => { - console.error("Error while loading BLS module"); - return reject(e); - }); - }); - }); -} -exports.initializeBLS = initializeBLS; -/** - * This function must be called after `initializeBLS()` is done. - * Calling `await initializeBLS()` on program startup is library user's responsibility. - * - * This is used for synchronous code execution. - * Within this library, this is always called to get BLS module to keep code synchronous. - */ -function getBLSModule() { - if (!exports.BLS) { - throw new Error("BLS module has not been loaded. Please call `await initializeBLS()` on start up"); - } - return exports.BLS; -} -exports.getBLSModule = getBLSModule; -function G1Element_from_bytes(bytes) { - assert_G1Element_valid(bytes); - const BLSModule = getBLSModule(); - try { - return BLSModule.G1Element.from_bytes(bytes); - } - catch (e) { - // Print exception message if debug module is enabled and loaded. - const message = "Exception in G1Element operation"; - /* - const get_exception_message = BLS.Util.get_exception_message; - if (typeof get_exception_message === "function") { - message = get_exception_message(e as number); - } - */ - throw new Error(message); - } -} -exports.G1Element_from_bytes = G1Element_from_bytes; -function assert_G1Element_valid(bytes) { - const BLSModule = getBLSModule(); - const { G1Element } = BLSModule; - if (bytes.length !== G1Element.SIZE) { - throw new Error("G1Element: Invalid size"); - } - if ((bytes[0] & 0xc0) === 0xc0) { // representing infinity - if (bytes[0] !== 0xc0) { - throw new Error("G1Element: Given G1 infinity element must be canonical"); - } - for (let i = 1; i < G1Element.SIZE; ++i) { - if (bytes[i] !== 0x00) { - throw new Error("G1Element: Given G1 infinity element must be canonical"); - } - } - } - else { - if ((bytes[0] & 0xc0) !== 0x80) { - throw new Error("Given G1 non-infinity element must start with 0b10"); - } - } -} -exports.assert_G1Element_valid = assert_G1Element_valid; -function G1Element_add(g1Element1, g1Element2) { - try { - return g1Element1.add(g1Element2); - } - catch (e) { - // Print exception message if debug module is enabled and loaded. - const message = "Exception in G1Element operation"; - /* - const get_exception_message = BLS.Util.get_exception_message; - if (typeof get_exception_message === "function") { - message = get_exception_message(e as number); - } - */ - throw new Error(message); - } -} -exports.G1Element_add = G1Element_add; diff --git a/.dist/npm/__debug__.d.ts b/.dist/npm/__debug__.d.ts deleted file mode 100644 index 5d1b270..0000000 --- a/.dist/npm/__debug__.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare function prettyPrint(enable: boolean): void; diff --git a/.dist/npm/__debug__.js b/.dist/npm/__debug__.js deleted file mode 100644 index 5a5ac59..0000000 --- a/.dist/npm/__debug__.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.prettyPrint = void 0; -const SExp_1 = require("./SExp"); -function prettyPrint(enable) { - if (enable) { - const toString = SExp_1.SExp.prototype.toString; - SExp_1.SExp.prototype.toString = SExp_1.SExp.prototype.__repr__; - SExp_1.SExp.prototype.__repr__ = toString; - } - else { - const __repr__ = SExp_1.SExp.prototype.toString; - SExp_1.SExp.prototype.toString = SExp_1.SExp.prototype.__repr__; - SExp_1.SExp.prototype.__repr__ = __repr__; - } -} -exports.prettyPrint = prettyPrint; diff --git a/.dist/npm/__python_types__.d.ts b/.dist/npm/__python_types__.d.ts deleted file mode 100644 index 5a97f7b..0000000 --- a/.dist/npm/__python_types__.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -export declare type int = number; -export declare type int8 = number; -export declare type uint8 = number; -export declare type int16 = number; -export declare type uint16 = number; -export declare type int32 = number; -export declare type uint32 = number; -export declare type int64 = BigInt; -export declare type uint64 = BigInt; -export declare type uint128 = BigInt; -export declare type int512 = BigInt; -export declare type float = number; -export declare type str = string; -export declare type bool = boolean; -export declare type True = true; -export declare type False = false; -export declare const None: null; -export declare type None = null; -export declare type Optional = T | None; diff --git a/.dist/npm/__python_types__.js b/.dist/npm/__python_types__.js deleted file mode 100644 index dfc0d5b..0000000 --- a/.dist/npm/__python_types__.js +++ /dev/null @@ -1,4 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.None = void 0; -exports.None = null; diff --git a/.dist/npm/__type_compatibility__.d.ts b/.dist/npm/__type_compatibility__.d.ts deleted file mode 100644 index 3f5987d..0000000 --- a/.dist/npm/__type_compatibility__.d.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Word32Array } from "jscrypto/Word32Array"; -import { None, str } from "./__python_types__"; -import { G1Element } from "@chiamine/bls-signatures"; -export declare function to_hexstr(r: Uint8Array): string; -/** - * Get python's bytes.__repr__ style string. - * @see https://github.com/python/cpython/blob/main/Objects/bytesobject.c#L1337 - * @param {Uint8Array} r - byteArray to stringify - */ -export declare function PyBytes_Repr(r: Uint8Array): string; -export declare type BytesFromType = "hex" | "utf8" | "G1Element"; -/** - * Unlike python, there is no immutable byte type in javascript. - */ -export declare class Bytes { - private readonly _b; - static readonly NULL: Bytes; - constructor(value?: Uint8Array | Bytes | None); - static from(value?: Uint8Array | Bytes | number[] | str | G1Element | None, type?: BytesFromType): Bytes; - static SHA256(value: str | Bytes | Uint8Array): Bytes; - get length(): number; - get_byte_at(i: number): number; - concat(b: Bytes): Bytes; - repeat(n: number): Bytes; - slice(start: number, length?: number): Bytes; - as_word(): Word32Array; - data(): Uint8Array; - raw(): Uint8Array; - clone(): Bytes; - toString(): string; - hex(): string; - decode(): string; - startswith(b: Bytes): boolean; - endswith(b: Bytes): boolean; - equal_to(b: Bytes | None | any): boolean; - /** - * Returns: - * +1 if argument is smaller - * 0 if this and argument is the same - * -1 if argument is larger - * @param other - */ - compare(other: Bytes): -1 | 0 | 1; -} -export declare function b(utf8Str: str, type?: "utf8" | "hex"): Bytes; -export declare function h(hexStr: str): Bytes; -export declare function list(iterable: Iterable): T[]; -export declare class Tuple extends Array { - constructor(...items: [T1, T2]); - toString(): string; -} -export declare function t(v1: T1, v2: T2): Tuple; -export declare function isTuple(v: unknown): v is Tuple; -/** - * Check whether an argument is a list and not a tuple - */ -export declare function isList(v: unknown): v is unknown[]; -export declare function isIterable(v: any): v is unknown[]; -export declare function isBytes(v: any): v is Bytes; -export declare class Stream { - static readonly INITIAL_BUFFER_SIZE: number; - private _seek; - private _length; - private _buffer; - private _bufAllocMultiplier; - constructor(b?: Bytes); - get seek(): number; - set seek(value: number); - get length(): number; - protected reAllocate(size?: number): void; - write(b: Bytes): number; - read(size: number): Bytes; - getValue(): Bytes; -} diff --git a/.dist/npm/__type_compatibility__.js b/.dist/npm/__type_compatibility__.js deleted file mode 100644 index be9d43f..0000000 --- a/.dist/npm/__type_compatibility__.js +++ /dev/null @@ -1,377 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Stream = exports.isBytes = exports.isIterable = exports.isList = exports.isTuple = exports.t = exports.Tuple = exports.list = exports.h = exports.b = exports.Bytes = exports.PyBytes_Repr = exports.to_hexstr = void 0; -const Hex_1 = require("jscrypto/Hex"); -const Utf8_1 = require("jscrypto/Utf8"); -const Word32Array_1 = require("jscrypto/Word32Array"); -const SHA256_1 = require("jscrypto/SHA256"); -const __python_types__1 = require("./__python_types__"); -function to_hexstr(r) { - return (new Word32Array_1.Word32Array(r)).toString(); -} -exports.to_hexstr = to_hexstr; -/** - * Get python's bytes.__repr__ style string. - * @see https://github.com/python/cpython/blob/main/Objects/bytesobject.c#L1337 - * @param {Uint8Array} r - byteArray to stringify - */ -function PyBytes_Repr(r) { - let squotes = 0; - let dquotes = 0; - for (let i = 0; i < r.length; i++) { - const b = r[i]; - const c = String.fromCodePoint(b); - switch (c) { - case "'": - squotes++; - break; - case "\"": - dquotes++; - break; - } - } - let quote = "'"; - if (squotes && !dquotes) { - quote = "\""; - } - let s = "b" + quote; - for (let i = 0; i < r.length; i++) { - const b = r[i]; - const c = String.fromCodePoint(b); - if (c === quote || c === "\\") { - s += "\\" + c; - } - else if (c === "\t") { - s += "\\t"; - } - else if (c === "\n") { - s += "\\n"; - } - else if (c === "\r") { - s += "\\r"; - } - else if (c < " " || b >= 0x7f) { - s += "\\x"; - s += b.toString(16).padStart(2, "0"); - } - else { - s += c; - } - } - s += quote; - return s; -} -exports.PyBytes_Repr = PyBytes_Repr; -/** - * Unlike python, there is no immutable byte type in javascript. - */ -class Bytes { - constructor(value) { - if (value instanceof Uint8Array) { - this._b = value; - } - else if (isBytes(value)) { - this._b = value.raw(); - } - else if (!value || value === __python_types__1.None) { - this._b = new Uint8Array(); - } - else { - throw new Error(`Invalid value: ${JSON.stringify(value)}`); - } - } - static from(value, type) { - if (value === __python_types__1.None || value === undefined) { - return new Bytes(value); - } - else if (value instanceof Uint8Array) { - return new Bytes(value.slice()); - } - else if (isBytes(value)) { - return new Bytes(value.data()); - } - else if (Array.isArray(value) && value.every(v => typeof v === "number")) { - if (value.some(v => (v < 0 || v > 255))) { - throw new Error("Bytes must be in range [0, 256)"); - } - return new Bytes(Uint8Array.from(value)); - } - else if (typeof value === "string") { - if (type === "hex") { - value = value.replace(/^0x/, ""); - return new Bytes(Hex_1.Hex.parse(value).toUint8Array()); - } - else /* if(type === "utf8") */ { - return new Bytes(Utf8_1.Utf8.parse(value).toUint8Array()); - } - } - else if (type === "G1Element") { - if (typeof value.serialize !== "function") { - throw new Error("Invalid G1Element"); - } - const uint8array = value.serialize(); - return new Bytes(uint8array); - } - throw new Error(`Invalid value: ${JSON.stringify(value)}`); - } - static SHA256(value) { - let w; - if (typeof value === "string") { - w = SHA256_1.SHA256.hash(value); - } - else if (value instanceof Uint8Array) { - w = new Word32Array_1.Word32Array(value); - w = SHA256_1.SHA256.hash(w); - } - else if (isBytes(value)) { - w = value.as_word(); - w = SHA256_1.SHA256.hash(w); - } - else { - throw new Error("Invalid argument"); - } - return new Bytes(w.toUint8Array()); - } - get length() { - return this._b.length; - } - get_byte_at(i) { - return this._b[i] | 0; - } - concat(b) { - const thisBin = this._b; - const thatBin = b.raw(); - const concatBin = new Uint8Array(thisBin.length + thatBin.length); - concatBin.set(thisBin, 0); - concatBin.set(thatBin, thisBin.length); - return new Bytes(concatBin); - } - repeat(n) { - const ret = new Uint8Array(this.length * n); - for (let i = 0; i < n; i++) { - ret.set(this._b, i * this.length); - } - return new Bytes(ret); - } - slice(start, length) { - const len = typeof length === "number" ? length : (this.length - start); - return new Bytes(this._b.slice(start, start + len)); - } - as_word() { - return new Word32Array_1.Word32Array(this._b); - } - data() { - return new Uint8Array(this._b); - } - raw() { - return this._b; - } - clone() { - return new Bytes(this._b.slice()); - } - toString() { - return PyBytes_Repr(this._b); - } - hex() { - return to_hexstr(this._b); - } - decode() { - return Utf8_1.Utf8.stringify(this.as_word()); - } - startswith(b) { - return this.hex().startsWith(b.hex()); - } - endswith(b) { - return this.hex().endsWith(b.hex()); - } - equal_to(b) { - if (b === __python_types__1.None) { - return false; - } - else if (typeof b.length === "number" && isBytes(b)) { - return this.compare(b) === 0; - } - else if (typeof b.equal_to === "function") { - return b.equal_to(this); - } - return false; - } - /** - * Returns: - * +1 if argument is smaller - * 0 if this and argument is the same - * -1 if argument is larger - * @param other - */ - compare(other) { - if (this.length !== other.length) { - return this.length > other.length ? 1 : -1; - } - const dv_self = new DataView(this.raw().buffer); - const dv_other = new DataView(other.raw().buffer); - const ui32MaxCount = (this.length / 4) | 0; - for (let i = 0; i < ui32MaxCount; i++) { - const ui32_self = dv_self.getUint32(i * 4); - const ui32_other = dv_other.getUint32(i * 4); - if (ui32_self !== ui32_other) { - return ui32_self > ui32_other ? 1 : -1; - } - } - const offset = ui32MaxCount * 4; - for (let i = offset; i < this.length; i++) { - const ui8_self = dv_self.getUint8(i); - const ui8_other = dv_other.getUint8(i); - if (ui8_self !== ui8_other) { - return ui8_self > ui8_other ? 1 : -1; - } - } - return 0; - } -} -exports.Bytes = Bytes; -Bytes.NULL = new Bytes(); -function b(utf8Str, type = "utf8") { - return Bytes.from(utf8Str, type); -} -exports.b = b; -function h(hexStr) { - return Bytes.from(hexStr, "hex"); -} -exports.h = h; -function list(iterable) { - const arr = []; - for (const item of iterable) { - arr.push(item); - } - return arr; -} -exports.list = list; -class Tuple extends Array { - constructor(...items) { - super(...items); - Object.freeze(this); - return this; - } - toString() { - return `(${this[0]}, ${this[1]})`; - } -} -exports.Tuple = Tuple; -function t(v1, v2) { - return new Tuple(v1, v2); -} -exports.t = t; -function isTuple(v) { - return v instanceof Array && Object.isFrozen(v) && v.length === 2; -} -exports.isTuple = isTuple; -/** - * Check whether an argument is a list and not a tuple - */ -function isList(v) { - return Array.isArray(v) && !isTuple(v); -} -exports.isList = isList; -function isIterable(v) { - if (Array.isArray(v)) { // Including Tuple. - return true; - } - else if (typeof v === "string") { - return false; - } - else if (typeof v[Symbol.iterator] === "function") { - return true; - } - return false; -} -exports.isIterable = isIterable; -function isBytes(v) { - return v && typeof v.length === "number" - && typeof v.get_byte_at === "function" - && typeof v.raw === "function" - && typeof v.data === "function" - && typeof v.hex === "function" - && typeof v.decode === "function" - && typeof v.equal_to === "function" - && typeof v.compare === "function"; -} -exports.isBytes = isBytes; -class Stream { - constructor(b) { - this._bufAllocMultiplier = 4; - this._seek = 0; - if (b) { - if (b.length > Stream.INITIAL_BUFFER_SIZE) { - this._buffer = new Uint8Array(b.length * 2); - } - else { - this._buffer = new Uint8Array(Stream.INITIAL_BUFFER_SIZE); - } - this._buffer.set(b.raw()); - this._length = b.length; - } - else { - this._buffer = new Uint8Array(Stream.INITIAL_BUFFER_SIZE); - this._length = 0; - } - } - get seek() { - return this._seek; - } - set seek(value) { - if (value < 0) { - this._seek = this.length - 1; - } - else if (value > this.length - 1) { - this._seek = this.length; - } - else { - this._seek = value; - } - } - get length() { - return this._length; - } - reAllocate(size) { - let s = typeof size === "number" ? size : this._buffer.length * this._bufAllocMultiplier; - /** - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length - */ - if (s > 4294967295) { // 4294967295 = 2**32 - 1 - s = 4294967295; - } - const buf = new Uint8Array(s); - buf.set(this._buffer); - this._buffer = buf; - } - write(b) { - const newLength = Math.max(this.length, b.length + this._seek); - if (newLength > this._buffer.length) { - this.reAllocate(newLength * this._bufAllocMultiplier); - } - const offset = this.seek; - this._buffer.set(b.raw(), offset); - this._length = newLength; - this.seek += b.length; // Don't move this line prior to `this._length = newLength`! - return b.length; - } - read(size) { - if (this.seek > this.length - 1) { - return new Bytes(); // Return empty byte - } - if (this.seek + size <= this.length) { - const u8 = this._buffer.slice(this.seek, this.seek + size); - this.seek += size; - return new Bytes(u8); - } - const u8 = new Uint8Array(this.length - this.seek); - u8.set(this._buffer.subarray(this.seek, this.length)); - this.seek += size; - return new Bytes(u8); - } - getValue() { - return new Bytes(this._buffer.subarray(0, this.length)); - } -} -exports.Stream = Stream; -Stream.INITIAL_BUFFER_SIZE = 64 * 1024; diff --git a/.dist/npm/as_javascript.d.ts b/.dist/npm/as_javascript.d.ts deleted file mode 100644 index 20783e4..0000000 --- a/.dist/npm/as_javascript.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { CastableType, SExp } from "./SExp"; -import { Bytes, Tuple } from "./__type_compatibility__"; -export declare type TOpStack = Array<(op_stack: TOpStack, val_stack: TValStack) => unknown>; -export declare type TValStack = Array>; -export declare type TToSexpF = (arg: CastableType) => SExp; -export declare type TToJavascript = Bytes | Bytes[] | Tuple | TToJavascript[]; -export declare function as_javascript(sexp: SExp): TToJavascript; diff --git a/.dist/npm/as_javascript.js b/.dist/npm/as_javascript.js deleted file mode 100644 index 9836500..0000000 --- a/.dist/npm/as_javascript.js +++ /dev/null @@ -1,59 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.as_javascript = void 0; -const __type_compatibility__1 = require("./__type_compatibility__"); -function as_javascript(sexp) { - function _roll(op_stack, val_stack) { - const v1 = val_stack.pop(); - const v2 = val_stack.pop(); - val_stack.push(v1); - val_stack.push(v2); - } - function _make_tuple(op_stack, val_stack) { - const left = val_stack.pop(); - const right = val_stack.pop(); - if (right.equal_to(__type_compatibility__1.Bytes.NULL)) { - val_stack.push([left]); - } - else { - val_stack.push(__type_compatibility__1.t(left, right)); - } - } - function _extend_list(op_stack, val_stack) { - let left = [val_stack.pop()]; - const right = val_stack.pop(); - left = left.concat(right); - val_stack.push(left); - } - function _as_javascript(op_stack, val_stack) { - const v = val_stack.pop(); - const pair = v.as_pair(); - if (pair) { - const [left, right] = pair; - if (right.listp()) { - op_stack.push(_extend_list); - } - else { - op_stack.push(_make_tuple); - } - op_stack.push(_as_javascript); - op_stack.push(_roll); - op_stack.push(_as_javascript); - val_stack.push(left); - val_stack.push(right); - } - else { - val_stack.push(v.atom); - } - } - const op_stack = [_as_javascript]; - const val_stack = [sexp]; - while (op_stack.length) { - const op_f = op_stack.pop(); - if (op_f) { - op_f(op_stack, val_stack); - } - } - return val_stack[val_stack.length - 1]; -} -exports.as_javascript = as_javascript; diff --git a/.dist/npm/browser/blsjs.wasm b/.dist/npm/browser/blsjs.wasm deleted file mode 100644 index b8f924c8a75e9f99924f9e35e7ad0b36d2dc13f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246788 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

_FmqI*a~>>@sorM^SawtPl1dW_$8j9 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≧t5aHuX;tEmc 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ДI(m@qHYi!p-eq;SK{a1*gze() zHm;gNXOkAF=Pbzb{s!^Svj%qtyr-?Es?}PlIFzpz6IO?wwgwT@5c&0;jIOjo9gZ1v zZmXeRs6E;?st(r<9d2b{X)AQL8S81wO=7cr`StjNS&?s>hRV>7H~fEq6E3DY8EP)- z3_CjKUmQ6gq+_MlBSTcy<;MAd$s`#$9!Gs=$Z%luOgc`R=vSC&xmtTz3Vpu%YAbse z#{g>e1%g3tPL!daK{XEY)5(DYWNfL25d#rKU{D7VyC+{J*dufY95bzl8Bw&0O%GZY zMHg3ps07LnRszCuz4SjoLO10!8=9}}Y5_Cqr4Rz?S%r-cn7(k}W35E2pB1Lz@ zN^OAke9sUMYw;pfXbULnD9#@fIl~NUN&Il?IqI?vh0SITdpCzG%N=j}eP@M4 zet99y%wdRR+}s^N6E5e8HBfFcd8mgjU`8Fs%+e0$*pX2yNmzkPpjkSe_4a{-ZSAfMYAXK#C`X6fKxp zn_bTdMbmT4Mp-l;9P%~Nb*qgCrMQBV`akF6HUR9M()3?X@k!x;bI+8s>QNi-g3?04 zSU=Vw0l}vUip{`jm%EO<>1#EqGgA$vazh{BA+4f3#5ZM%zksdMrbNab=SkA_6-7vp z8+cPW=NKk*$3f)Ie1)(}USVB1uhi%VE@L95FcGD%fT+4pAgwnyCP)~`dLi^5%sHl!X3~ zto^8Q2Ny4~7VqnPJ^Na`H^uIQ?Jt)O8@trLlW@*<$joq*Z(5wJhaEB}>$ct+7q0lw z=XBo`3Y5k2a>)v^W}kI;kMG%GEKOK`J=5q$5F9t`iexWi04-PI1_xVLe0c;J<2>0c zl~c2IcwIG`wQbjpN}DWLfoJ;PW|Sy`3re2$B~=Ki#ZOc&g`rx!rXRWfirbBctl9|) zdJ5-93gYi6_V3fgn7xuMB~42>o`hFb0MFL*f&w=GQkFpMEROdy70o<3_RK0O3oKoc z3C~>;o^svS9Nl^0GPQ%^gcflf#w$;XgX~+kbzcXyb;eeD9gY>^oE1&!upcEqBKIL4 z#ot8UeD(<+XR_|gJ$>>~N^Io=i^LE(u{9x*fp64)Zj~vpl{N>q&cs_6@|FHs@`uHt z&R1m$q+HBin5KTp%++b^Ef%uZ>aWU9$a85J|1W#*0%uoQ-+QmU_uMjj2rCFCm|FMj4>^sHfqlOu)Mo7)hzPy~ThIG> zPt&>VfsiYc1fjKMM66iT8Wla!(mGoD5nHf1Emn>Pb!ur%D{87}qehJgN-NfA={adn zj=taD|5H#Kf>Xw*8}U&8LQ`o%psnLCIdig%F&3oc*m9W;2 zI_H*?;bL6Etqmmz!TtT(5F;DN?X*weWVsDT2%ocJ{wqDG0>Kp)|5U$!Z%hK84M}4b zgi}&ifv}}UhNYdU!pmQ=U=W$IDSJMT3v&Zqi9uNh^jQ{Xdw=&H=&H4aWa`bG;@%Ro5oN6 zZY)$t0ES-m`)_hv7HsRCYrkJswsW%B>gGi!S*irv+ssNy5&okOza=Jz7QU~e-gK%E zC?flA3Zdlv-;bwb{wI{%?|)oBaepu6HSwkr{&)4c!4}|};xi;tnso$sCft3J+E{4H zGk79_-tyO>Mo9U46fKTp==S@o7&A2I|3GYkrXKU(&309^1OHiJ{vPII4kEF?Yz`&8 zpGt~pz!W@SDU?`nkEMwJ1b37AFagQnw`>Qklr%IU_3Zx=hOiPAAhq^Irg!V&2XzL^ z${w+-2id2Axken6V|@qwRpuU2GlLi4^tv}U&bjhSg2z1qBUrji5F-9-{GDba>K+yU z*F*v|&0ZiF6Kv32CH#MtL{16^nD;i;)$v2nfi}QmKw~PoPWksExK)Y1<`4BixQAkp z;gJ8I=+T8QqD%Z4(H{rtGQUS`uU#zpOYUTgxejLmmKYZVIIBVR#iXs1Y={eIzb;Sr zuM~G{vm2?n|50fj3nYmlv3-m>=WJ>5m-}K#xsUrgmz?+O3?Kq<M(S4~`k_9<{$>gJK%+ z*mmb4RYp{;uO8~9;0zh7-PkjNipV}A3bsh&LkZ5HAJkm~Nl0?gQEU*Kkpt?8mdZr2 zdfk(SZb;&~JZ=sq2a82eFu&FbE79u(>Nu;BjbwF_tH5;w9?aR~+pt#0j~THZO(PTDA7Z#7bqvyCDsv$H7ODu(jVUus~}uX4fAR#|BH%jDxWj4;GDOF@%I3CcleRhp0}?(UaAD^!Nn4{tP=Ycn&?eXw;#MpwNheGLw52{*8B@8Wxs8({k~mj&?L*LhjQ#4) z(T|y3HGo}(IMo?`L@MwvWfUsG%*`E|9r7@R1Z;bylfyN$6TSK^dtreEZ_GPe6+xIX zYy9`%4Gglo;oai3C8{2g!p2Xu5{Hh*6YJyaX{Rqdm7CGCkQMt9E!RhL$xa_-c+j%} z{{w6X;~P%v@!!iKvhqHd)WfcD|C?Rm?_qeor_0HN8}z>`JI;EE8CL;pG1cjs=rb_5 z2B2A5OD8sIb&(y*LfvHITc8F8u?fBlNCamBG5&ATeFra{RG<>t!v<&sF3yy-a)j`} zN&@~TknX>Mcz3w>EQTsjL24(+qTQZ4VOZw^rV^X@jr+GzSYxxg?S44MqUeDvA#me> zMcu$GA(%NF$x@0Lf~+>WsTUf(_)v7>C}D=0*i;B+f;a}f-m)z$0k(|1%4mG)ruopI z`fkF-YmTtX+(|;{_AodV-9908A-a{0-`^u3%nDVFNQaPgB`3PH`-vDhMMPpVIP$fE z5&eFGufP@s9Wyb*wyo&!s!zIC;b1!ln7o^XAJb7G+`5<_g~aoGBiM+F0w&1sk;Xt z3fX%F%##SIVP5qLDU6jKA+?uboJ2_JLlaWBgRZ|kosg2ulaS*2-P?~7Qfs}Xa8fK- z+Ie*{A$1cw)}4&HX*9HiJ0gkztm?Pbwu$vnMyT0VVOH|Pv|L2UL zBzfMkn52UKb!vz_Nr@*uxI2*^L@?>{BWmasOjaG!Ig(3plS_8UlH?MTv)H|0?$Z)V z=xuG)c0x(;LF!5(8Hk)jVvUkMSz_V^i6mF*ja`W(pUO!jh8{{JQj$pVP5j3E-$ABJ zB8k2eCW!?-EtE)e_;?+Ov)2h22nedm#Nu)Qa!;wUqbrQ+(@o(BU{~ZGxJL^m&Qn)v8Q}8WqFK`m6 zlXr4)^w!geBdU11;)qVuV-2IvzaK%gi6GdRH@rXwMI6y1g9Jv+W}XbYb_{}HKaxRn zHt!Qp{!!fR$ezPcaxvw2FlXDo;g3BCCUKlpD-y%5R#3cHWW}GK5@RtN?SGo+78^!! z%~di*!4W*kIGmU6XTt!JmI)_+f1jijQK?a{!+TU(A_8Y|=mXHZ84svE_Zs z`TUnE#hAJ=^E+3(ixTf4o>ckyySwwtQ&$@+HaTBg@ZPo?O0s**WJj8Ajkl z=JjAu5tFm8$Ny~K$O@MasCx20(>JnQ6O59U5(fgH!Bh|ci8^(_LnONYoe}yK4SIxT zy7h1+;Adi^9+JhT^NIW4NHwv`wYB#pSJ(y*>V;4wfN@zlB26aQ$a$*dfp=c4OWO!6 z4F>zdv`_k;Fbyz+xiBr5_x6?fPRQPOUE+}F!Qfy|Z3lX4+uu{${F&7Dg3}LhdC$>ptXfx0*vQ;iZVj&_F}?XC)_RF2E4OX@~m}m zcn&Pr3q~$;)GJTOP>kz%8Re6mK~p!clF5+~_2ck6FAmnQo0OQ7)$LeH*GsL5$dn;L z(C^aJi9CwIVDGye1BlS~gz3cy9Y5I-I!lgEhm=b@{e#htLka=W!C-&bkhpF>Osg{w z^mJz5DLT{PIu<|mbSAbKjSlp5X2o%xVUDEzPf=Mi8CgtG(Za65 z=$yx<(>a}4H1Q9nfhZj(jWbvh;TbH-iq2q>6KCrQ+^$hCdAX~lvyfH_S?V5@H6WEG zOT6qLXUl7)H)23eu@ejj2-w9zl2@EjMN&binx3jY^OIBsd-hcI*%PbEdJD;@D+kV9 zoK%=Xu|=}sJ;nn)3^CBd5Cc67F%WbaqL*gH-Np_ECcCHAOMW0U6{x>sD(LcQXDXTaG^?VtMdGgSMX zN)n5K>hx;A^ZlZrJ`=Tn>Kaa~_BjMR^fwk)`@gY3?N9iB8mj$m3)H^6=98;^+K3^3 zdo;r{RQpf;WNQD;cV2AKy0f9Z-@>|7uid{yJJ)<*3-kN49OLg^>av)) z|9)*WvlwvvxQQzIQ5N4?MFdyWG2-%S538OmA{!A7`M!HfKyJq%6<8oMG77u z(l^T%etoKCAF~?m5jKxlM+iH*X+7#s58Iu9w}P;rCenA3-f3wGEi%iZ6O>iSG2&~T zjiG6984MB*c9T@hY>FJ*4C|8#M-#KXG;vhE$59{;P5iGfbZJ6phnzHt z|FCGHUn^W9nxNHGUo`;?HCvN%1)&5{ICb$CV0I{>nh>o})q)a6D>^*dK@noniH!zC zQHNWj#YgESwo!*=S`h&())kR(IC1na9q4qVi}|XkBUtcKoFkq4 zKKw_tR96ri%7=S8yFbLZ>+C?>F#fQhNv9pgd1ae}=(=ItZsZ`i>M%|Vw!o<35WWPI zvtFO?A2L+KY#zR$LpQ&|Hg8wQ8~OutMod2dwzc%jNUe+Q&xY4}<3`vdfCK<+LcBt# ze#dW&0csNf|AYWR5Ev%p)1-$k@Ibf-z_=YJg#j#K%c^#|F2_i=S_rtnwO!b-DZ|DY z{5K>aTesbv0cKx`p1F1@9G=Z)nPkIn`Nz=p?TqeRjn1y(i$t1fyIArIF}Ef(8c*=X zP&oe--FbZ|o4W&i)0<8hpqL3Sw!e3P5*BuXtQ%l3!XXAd!_yK`hkDj}1&2L%TWe=f z+Ni*({CsfILGe@Qj{koMlD_fuk#yVu&j3j*O+0HM6)r#%u5w~$@LkxG z(~_QTgx%I1V7Q)N(U5Q+0kgte<{4XY3)h&pGA$Wu%P7-{z`H!%M-Foq2!HgQNKfnB z#eKRN)hg**316`?IKkzVNLxEmUuxJ6r42dZk(e`eGLFUiHJ4x#0WNkoAHlk26^Jw~ zEVg3V63@2tz@jpCVMrzXKa7vctRq!Mq-gTh-h2L^nZgVoK8(_WNmT6jY0FPg%su{) zN3lKZY*&CB(EM6I3l$Xw^%Y5CnnthvhqSp@xvQB#wyHRO7Dpz$O);MQSZIBT$xL8% ztgrtEAV$X5Yov-KnVgn4A-R52Xn7r!;6y5!<+Xm(Ne!=XPLp0a!%KDzZSefh9lOiu z@P^3flEsx-XmHswCsq-7Zh|K=xMrhCSIOI>pgA~-JY3Y^I-vQvhh7Bjej zh8Z&tvpnJ%7+hwjGlmlkuGonN7fqa@!Sy8($H@#XBZIENHS3PrTWD}~9179Ie$fOz z!r}(koM?iTb*DABC>WYkZduWZ2G{W=j8+yJTzf(S=o(ynlzzGf7fTFfnYi^$UCcX! zYr)IK3@!$1D8I|LRzF>X>n=f)PM=_K8O9eHT(oc|2A84xBnFpZyK8VkYF&ft&%3I@ zI-nPi35m;GbRe3^0fF z<%^TgqEU43PiPc9bxNZsTr*-u(O;d;D0*jT6ydgLRga80?R>+!BiV;B$zD8cNileL z6JDR&gx8m3e$Q>$NN7Wkc*5DD@sr!4n*GBTW%4;RMB_b%sN3R|iY1T5ouD`z89SO; zJU}mGit1_vEra)q7T&=$bSvvIul8^N>zy2!d*{UzIZP2-f69w+YXPg{wZJ#LDTg`r zthT^D$Y?3=qZvo|)qHwleSAI1gBEMR-wsy-02B)Aavi4;NNFvPa@fJe{X5;-$#(Tq z>w}6|sWN{&@CDo8L9?!G$Cy#PY%SaAtxkV1&Y}ZXK3r(Ph^^(=CbhwWMJezEy|#Vw zHrMJO)>2liV^$|)yM_%?je39L3I*yr=q7&I9b@~s0GP8alAldzcBB)<5$q++1bd6- z9HjF!u5A_kebW9uLBIc0nOF-z88bJ8a?GGW6%RQmYblsKYM?A0lnK8*{(SndB}iHW&St~py#~cg{U!pY)SL#_>**K zb^Hnb1{#rvy~rO{usL<8;rV}(FjS}(hYCj)yji7{AuK>%Zoj%zMx#%$M)DBfY$IIK<}@f`<$|bspN|?;-oEN(`S5kXRI-+WbxNUasL0d`dkD zp93L2pD-qZxVlWlw@(|N_ZvQ`%(i5e_i)?GJ69XqknUw-ch+&fPw7{)OSgEyKQT86IHEumtQt5N#RO8cYO*HazHf z35AGBt@U02iRwb;6w7GI!_QZ=ppWoC5`VQH-%X25ZI839>0qo{(ZR)X+y-L#+%%_9 z0)G1(;lefE3!E@V$Pc-##rtdw906pTc%LUkMR1;LLi|==CH|Zc;#|Tl3_h7wPWXR| zj|FYHA?~*W(rv?}KF$_UbNdM_RE6aAS<)*vkT1-h(w1D#H;b`HjWa_q zfpnr62j?nfc}j(DmQA;t|Jk!tHCnrBlOI~UN=r<5V39HV=lLJjJnMi$ZaSe%2~16G zWQl2s_drXv(}xwKG3G(o^rEZ6Fz0mNjOO;kP#R&0N4|7%a$D#qclPR-b;xM;Q>P+n z?%H}g%f!xq+OO;Gxo4DvyzHI-R+KY7<-A;1UBb;pgNd}@3vf&EM|dk!F0L~}SOh%n zOaN`mR|qdA)zz0ybkFSZMpZp_4qjAn*K0B<`!0KkNcO}sqA0KgrljAt=j+?qf}`^*CXROU~dNdVxFTmV4j z!zG7|_!$HMy1hSfts?c^aeM$^&w>EJTrceRgs|T$*vnCrNr#8b-|ySse*_7pFRMv*MLrEx(Cti50H6z$MRB>e$1GIu%q*M>JxJ$w zosyR#tDV7p!|?g_2%qyL77YL_Vy^S`A_0Id8TK;K)5fRMYsN&h(;EOVD}Igl4a28} z{JJ{Fh1EKKSBTFpYZ*R8vk^X@NdQ20eJ23WZM(;+@4{eF^udZJTJ??{qxjA9=mSa5 zA^IY>`B_Kbl}<%VWh%ywUX~?d5f#ObEv6D`L}i*rv;-QlvsuO+W#T2@8ScG488w7H zxbrO~j(-f){#ru&>F{x4y|G1?XrDF4J>KnJ&@4)fZ1d2P?m^*oyLuFb$hRVkyCPu(vSmAL{*WyIS*C+7q?a&EMbhoI4 zwgs5`&h(Aucm{OI9-#tG`QuI+GF3a~gKH$talN)n{IXHa_9hqa@fz=RJ!aQ{)?y|X z>G6}D9_v(30Kw9LO-vY_tnW0&(n#iky!4>@&TfWo-)TpEx8_{m8C=-+gy$s-07ZL* z$3_LYeK?;2oo%ph06`_9EyUdW>E@M^KhH<>3upFPxtv50@YT}^|4sdA`mPheSQ2Y9 z^r^%vR&sV2OJ4?0RPn~9@92bhu7rbva^Y~CrN z7~sxgERoHYhnCdEb1lw;Ek?`^C9({TsuVx824|GJ`kXHWtj@ zHl{Gvjp=iA`N28O(d7!ppI;NJ@Xyg7dvEAT|6hvX1u4LJP5?f*;fBkte)UHG?F^fX z566BRP2ugOD`$v)WH)lysp+tJn%jnL;EwI3Etm39%6z(n7wIsG%E}?#01>gqjsYm zKdGc0UzZ48O#fee`O47|N>eLw($t_15gxg3^hGsq^n7|Y0HQdh`NwC!AvI8>@fZEZ z>(b{7d3S#IP+}H>u*9$b+RJ!15LR(D?WfNFKsupGbDb}k=BOEZo}@lDG^7WZqjrUL zjfG~Jb-9M%pBlj%5(ozvAh2c01n-7}^KS^2Y_Tj`pU$l!H*l=!xxu%+*64X$f&z`g zI(+e3M)N{O!$3I0FR;#~UU(DtxZIk0;m+XJ9ivN;--*$K7ht zGG`L%=(yBbSFF_hDCD5g(!C)!0G-9iM=BF6**rQF46EbT-GI9*JfLZS(4{MhV0d#n zA;1e<(1-)h%1!)!$7?C?GIk{pFixEvRv0YVB=SfEv+OD27MCSk(%cHQ(@2!_Zuos9 zqEc=jOmX#zb%0x!=*=cR7-XveeNfYMY$-S)bI1bH41g<=xJQQ5juTq}Z-OtlU4*d% zRpQmHmC#1WfQNrBOdN?4M}LlfCR;1Rd>)aELF}e9d8uT|f5pnt6^)p2@A`UJXnmcI z#co__`>U4&x)VKx8gmcE09z=_53V4g!+X|k$b5XbE()k1Rj!LL&I_J75cUpUvW^OCEU0!TJ3hz6<5}T(HIB<;bNBoAUnL>2yP$^9-wzfZmIgc zbUVc~1~`jF)Eqn=kt>T!f(Y-&^`PM01Xf@70YpkX5be~Etx^6NiYni&PL^PAbA1`lbju*yM_}MWedS< zWaCqAv8O<9-(9{aPFe_bi{Q~RYrPdI?qJ6RR3-yNZ%T$CiqA%{NX!iAay7+(?*76U zvrMlO&0J1TborW^>GT6CQsYqnNgH?V3dLh4v1g!6Pi08|d&z2dG>MhQ+Avp2L~6 zx+6@6kG257BivQNOPiHEflWB1??%cAiH@Sv+B_S3ci7*i(6R8qHjBfJu@F&!TGh_i7#k5Ts8I5VlCl}-8p4|1k5Ey3E+*;f~@^_WfNeArR8 z^F(%)=S>JW&bB;T0N|t4$PJs=T#Xo7MjF{gvI!9_*%X|EJ#p0xGOCBkhf`;p{dpXd zr^Iqp7IuUyEM%l+s8w=EHVwV=B4PlW{_CQSn5dZdBr2$5pF8js0fG?WKBFZNqE8g~ zKP2TX9OnQLBS!bgH#&(M^fT_8(A|u=0~GNCMn*k>>wY4ls=v|0k*5@U^8+W_^yI2$K z7Qf-5f!HG)zMIC2v;|1uE4G3+GGXta9SLyRu1yf8QB zUmRb6Lx-ON^>KF-Xgw3azdr6*MM8D3sQ8G2(zk zWnX{@K~#Rc&xuOWTY_>3q)_2#dy}cJ!=`W!M(PUzO|4}5PJJyZ#iQmyqmTa;7Efagb~U3gg3|(0c87y=J1cetr0=u{&=}F^Wdjtgj zqdazoPigCX%m%lb&*@y;EDPiSrA3d>Hw4T_^R825vB4_r6sz_`>dCi+T{_$$X`>vf z-w%Y0q=|@wRPlq^P_`D)AvrP<#N;8`USypJX~32->ZSjWiBUsYxJuFB6RlE&KTHe9 zlDCDOc}BOK%B-@E^xkrMgqFx<2xofB=`&rMspg-_+RQ~wH>=F#>nTk)%{L%@J7&E} zUsR)Kh&j%lr^T-@4~iZ`t~gGZ9qfNzn4MOb34Z_Eg_$AIDYSo6 zVdmO3W2$>)^S_-ibFi1xe0mGb7Zqk!+3AIu3l$7WJRM;wx7?L&W@J`MTTc* z;|dtc<4WwrXBbO!d|*n?#G>4(N*IQU!wuSUbx@YIerc7y7ZO zbUb8#ivFBSfE=@H(4GO_1*t(jhsQd3>@0mH_b&1OU&mvEQeiSb`mm@CUHt~g(Ln$Q zx;W)p=tVD)(db;g$`fmBSqJ7(*O{VP7iaE z4fAlC&=g*|C6qV(=)5YssZ-~Is0Qt(1(me!1_bWan8Lg`1^>a}jkAJul?iPKe>$ch zHO!q`I`Eo<-hJKA&NTo^vpfKBv$Z&t&^^3Z&A1pCcif~)X~DA3|1us-m@SgAYyw2k ztyLz&5+hvDHM_DevYQ+@-;n6utSe9&@PLkhrzuM#NTbj};IRlK)zb))qP<>7jw}L6 zH|8WKYCSE83Srl*^_EF&Da8igRe>L7tD93mvZ10rc$ zLub4?B%EVD0%U;ZmmB=OMDi=~*b@reT4-Iu zUE_!Z=BjnRqo%A!H4rEZ5)iq--4T88xp5j8gQSEw%R$zpM^s)23K@=PyBwmBiC03^?h-`?mClpokYBE~*s=+#7-QfXy-uBtH>GH;dq|nY_cJ|od zjU-p>oKeP2!R(I`_I%UKOvz)ilyMY%E=seG1fTTm@^Jd(e=y7g)G7b<@U<~USU{Zh zyHNo*27B-SEcG4k#N`Hh(urU%nFsQjb zgB0QSPWvSrGjQ)9!06Z1k1h;H7fmzOg#~IaDX8l9Fmv*lS#^5`O|Ox;np)B^w{jM` z*4LZ-E3sNxX@`8~{hmQhSXlsvdRzcXF;WZjSgiD9c$*s(QocG68Rk;q86YslsPKw~k`ICF>$F=5ZU{j;WyTZ~E*3_SXZZDaFFt*t^Vw&H?5PcgypDL8}KX0a^>2*~1chSmGX7 zqQIMB_mH#)1cbgBu?I6B$Go%bfvIV|S!xeU-NV`TaJGA3Q6063u_?C99+tU>bL`<9 z_rUQl6nlYtIM*IzHSo=O_Hdqic%ePK&^;`-hvn{Jg*`}=@Xh)5aK3wZkv+&5=gmrc zSm_>q${sMh^ybC(@M8Dy)AsPw?%^f&@DfBlOY8iyv|3DLqo%+Os zl5oKVR3soz$%^U*K`zMwrraW z;t#4Xnqh*=G1$r5!onmiehL2T;nxo;WTUtUivslqcYbFYzdSYcij~0wyoYD*Ix?Sl zIU5R?Gm5^EeRFqwvp*)Y7mIB`PckaPjSEyU7##YwEtYL2pOx24Oqy!_v8;1ei`Wu&i-rWh`{ptKeK9Fo@p*$91^!gb zLO3Ciekcb}@Sy94g_M*z#s3KfZ-7Hq(5khRaQ@P>ji|5p|Njh8So8ljhzcX9^I<&9 zc?T{?gmD{2h~zO~jVLUEeIG7j@sht2bE~VOU|JY6!I+0lMImdDAXt z;#l4o*Kw*vMp%G^hBj$n!GYcopmWSccnjiIk@p{U&du$4$x9I}bXt{#wMZOjUX^@~ zWK5!?JIjRPD>buDms9bT{!@u$%{iCYj278)R~GWxIz<=MOFYefPw=2h%`T$}^ka%K z#d20_-z`nBg?kvqKS(53cv_{z<|jJ@FI=gBW2_f%>UnX@)OYyee}1j|#gX0@-|uGK;Wm0?`&ODg#-wa6uqW8)2;HV(Qq`s|7A> z%GQasFZPe3R5}OTfamT3H;E_&ntb%K*s@!LS=%n+DV8%k6x>d@j$vszk$!PHxM&#y zinHO!c_1-`ob6@sFYH;Got4;pF$+pw|I6$!2q6L+~t(PVH)}y)> z)H4qRDNDE!AnF)VS!}j0GR6vuUy8Mt+8HM>7TlC-qr52dl%MncW*5?Cx%1Xo+sayztP3R zx<3Ncbk=3{+3l_V1&}64zxRm?DYWm23vUQU2(+-P@gF+LLq8zNfu`OuR?2z7-1jaR#WA3d{ z#J^!nd``8;gxexxhlY8`yF4y3F5BQ{kW8c0o zg!kPpV|OQG&Sl*7cvRvpmvQf7QN~`E@!+?jj5}S%!;eN8dtAn$Z$=rrUB;7#ql`OT z#<6ci8MnKP-JOhCmvPtEqY}ryV_m=ZYf;8gm+|1CDB~%Y@$grpj3X}N&{x6?M*ifN zm45O&BJKl^0B=!f@Kh(Y_lr^9JgH!bk^Uop=aL4(C!P>H2Ty!^O$frrT*lpxM;V7* z#^G;88HZfPU5`c?2VKU&!%@Z~F5}K`L>UKM#(}Rz84tUR-G`!#{VrqwSE7uET*mER zjxy$5#{Az!84tRQV_%Fi9&i~CJQ8Kx?=qhHe3Y@zW$gRgFhd~xoYMC`0V4;qf3t?b zho48bWVD!e0|^96n8G!gmuP+H(}*1>MGk((B@L8&9ygxa_h`f*yIsca!%@Z^F5`)> zMH#odjEBA&Wz4#axi3c<#~!mvk9{f1IO;MEJ`!a-F_&@oUq=~-UB>LEqKrc>*@h++uxqR?bMtcW88KLJ9mvQIEql^PC~|Ua_eB{G zxs2QIjWXt4#{37Oj0auDvG+$A54em6elNnMDC1t2@#LN;;~tlB z&+aJWZkO@co1%<4mofK-Fay{e`jG&3*QZ2#kNuF<)-nIf7&`$=t6hR+kS>AFn`b6F zxaVIx(0uTiOU7>%FfrjrMVvC*SUHWYg^{zbv+uxW513KyyTQ#gpyrsGQLZzJ?*8G0 zl%HiUqqz&gVKywRO1CM7TJCac|K zrknITN%w{S-WYv3LSHa8*;jzw=U%XO<66vzQhc|7bYL*-BF7|fh`04N7VKdghb8+> z#ixgHS~8TTNSLC8d-flfkx4cDCA0Ujn|XDoh}w(!TU_DJU+VQ$#?{)bdqH0KovXE5 z_p2Awo$&vr+aFg*mHz^;2v@%X3o}gB=d|XcgArmKp~d6OQpA>xo;e{jPMS~*qmLua zMwi4{*r8*K2msxPRonBKCT2OsLjUtOwiCmf{cb5%h_Ej@wPbVmhkbH9`@hS)GNGE) z@k_aQ>jxL&b;wdu&AhToW)nW^3~Wm{GgFF7&07f;f~>LrAV4Xqp1H?TU!_`!u3_$;!;cw=UHh-K}6Lx`pOuN)v=s#BYm4#pE+ zBA$rhBP4A1|0QMBFv9G+d*0@rHLlu^I32*fryp^Y0R8c=u)lwY^+`A`v7X_}!3yhV zi3L!I2P`An)G413FFvAtKDQ4Q0MwR4CPFohoX|9C$6mGK2dx@lLWIoM37mq%e~Wip zq=0cir=XSicBiD8@Gr2Qf#N^u_xJVNGyP!Ei2q-36XI?ivto$^_~_$Z-@6bFiv_!3 zj9~`+7!NYkf2^UB|N0*#I3+p>{ooSqPFU;?2=uSkm+3^{U&W?ddH?|s6-cv%|0=?T znvAncxTsxejtB@2J}K-9nFBOHJTN&QUW?MLZLx0x=O*G#0%OhSSx4OdX4j2TVK(sT za0j3F(ep`K!U>;T8(+fr?R^+}HSh-yQ~F03u^{f`n?2o6*7U*9$cxHQp*&gA)r zZyS?anb7kAp8uie`Oz@FUjzM0_+X<(;FHzUlc_z)!BP8aMgSn5ooGF*XRMDgFb2-<$9Cj1`j}N(= z&Gc&@VUq;BV=4C+p6h-3yO?hMpj`O&ahbZ^$627|e=C*(D3auYjj<3zHo>i`(V|BN z`2}~Z-!UD?YBsBd(>Kt6T6KuLjdlg{Et@Td{cA_hM#m1-V&(YWJ1!zQ5Zv=a5Lg1HnOMSmlJM6P9%c9uOc(_`j$j^UEF3>Q z2X?#TqCWIHlgM{m#5yH~+($>~K!5PmQERWy_Q}nM${dEi|6ecUq$3iyE5VY4;O>7R zf#LujR7Az8k(FX>84mW$gUa25lSpm-!9fyICzi>uTqcPmDKtEYLHzj#84~}-{GU-_ zO*dX;8Pp_Lj4)iiAM}4F%od2q><=EHN1AQ`-&*}~h5ZGAT63u4nz6i!zpN(pKQGxb z67;zQ5lm_TntVi>UZ`{*^0lkdYywg%MEti%E($iDuSo$Fyh2f;nEI}N^*O&*yF{{l zR?cup`u`bGZjLK!=~$}~$Z=);V@43ey&a7~C3A!V-FZT$a+hdb#u8a5n}WVA!qRF{ z3+;xPLuArAKCzn<8l?FTsC9zVX$|=vw2MxiVz^pZiHuc`?*W;qk;{mJ0WsUpg^;&5 zbTSq^h}349+`oo2t4GqzpNAFkJqq|F-|LNi{}_hRAP@TfC^AhKHz>UuMsu~h=eZ?< zjH**7saqrv^=)a?x25Wv-dNrD53BBk)we&Xx?TFvNL06bKEhRJtjO`Naa7mmzGh^M zrgv;C6mU)U_x8QNr|&MUzH3dY#^L(iukX&NU)B%4Q=iaV{xynW-hQ?^EKs=)?_~w6 z1DAWgcbT5mta}zlg`B1SAL!@@M6Z@H8YvpB3>K}Dv}_!TkQ&`&M;*zgU_|zsHbvcJ@eSQg1l|=eKI)gUsXnthR34P@qbB^@w0k&a zT%^B`qdkWL#a_}&ZJJI27u{b;uEH>BpZbOZ#a_}Qql1!=E6h5FR;>#NyjM^o>ni;} zgmbinsgFNG=WzHYVQ=7h%s!m~|GT#J4PWPl9ov2G+)i>9^~0q2abFgbr#Cpnkw zBxg~9QCT!kR5o&3Ac06a#-f*e4K)nwfB&{PHeEWoQvHj`Rw%R^alA|r--cJQE1i_H6sL>PXqTD*oCiGA#ODo4a)UVnm7eOdsh*SUXm{)gB|$eQ&jQAE~|jKy~`S*iYF| zpj8(GwS0b9Yd~Sk<=9R?ypRM-0OzoEuGff8J9J%IN*3Hnd^LE#9Svv=$UIqGvM~Se$$#VDbn_2|`A?F6=(FAY!(smS$^YD^!~8(XGSn(E@;x9hXP(5P z@D#Mp!48moDL%_&qD5B;?iexn?-cnz_-Amq$s}Z5fsDI|yJA&R3qd4h+)i{B>Hd5D zr0-C=&!u(D1H~jvR7~+&eI<#)qhhv53X+;d-ZO7r3DJ(@qYFF}T#(I6JI-aHk;rA~ zx8p(R?r^A|-QgCD(w(M3D8ii*()Cklio*?%J)UDlo_SC?;gGKO1wxm^kuo)Y%hb4& zq>xZLhXTo^<0T}(IP<{?FB;d;76Tl#p?vpodXOU`^f<5btnY z9I$X)u)Z z7URIP$qy|$Bg`chWr7*+Oj`tQ#(|0hJkB}Z!k@&Aa0#K>AjToWSWfc!Ze~Ch=nA(( zkkzDyC($nQf!3=p=8sWSwecAwd;Dk0(r5Q4ohzfy4q`;f4O99U7K^LYJN2AR@Y~ zJTbhQ6c!^WfR9dE_;C4d$Q*%4d2O21SFY!j&(S|r*G0mQa3(!-ee zO`;J{yxHNiXYqS>GCb1dyC)v$QaEuH7+M2~CQr3z`PYJVU-u2gmTHww_nI+6*4j3~ zryOsgh12|DImEB){w_Y1aOo_Ex$9FGt7JUbrvyY4%zsKJ%BTW36InL0iN_m)hb-GN zWsZRjTlN~hPA9Y|M>{vg`dUnwW>p@?|0$F8LbcoGW@itx07Frr{-!pX#@KhrI*!%; zue^x#PvMt9=+SbG%c*65rz7g0lxw#)5BK!u!A`ja9X`-gq%*iXG)jsE;kemLHg7rH zPi;N0?NDw4*bTbyBFcdL1=;>O%M9-N#>M_OVxzq`G?isET|<(2Me=fP;T*pN9j5bYq%G1qg0&kblP|E5volAg-^ z*x7%B$x{4E_E*9x8m^8ab!#MXadF<6CiRysfr8lnP4f652L1jVp^&BiZz}X@H_$DS z^kafd`;i^cH`%gj2%jS;Jr1XLAdDFZ`&P#@#A+H~F80A$5=%ZQ95^dN&{| zFx*W&U~MNq)aQ1Tp0T(9act*+13Zje{lL}wVZ8d0fU@?8L>izrvGB|R*_kNxV1?r# zpAM=rW**LE)clYGY*J`l6Bg+{(r$NfVm%~I3{{~rY(6Ml6DleVf>nWVfJzf%X}h;& zYv;U-Jd3?*aXiOpvp8Pohii4beziP)3G-cSj#qR(ZDJ*=UX^1EP?@54%*LWbwBDUH z_Hdw$L%mk#*{15J>{2e<_&A=sDAg}QfW|t6 z5H~`I`evJJqGF5C%T4Y?usv>zA;+lNNlB3PbXrrA$YgE8Q!k)gb{-ffxihNN|L??_ z96B56yhV;NqYgW*(Q|w3@Pi@Xc=GpSZmG9SU9nNZR?X7ZsQfELi#tS1+wzWbl(gcf zI_J{F2*CUaj!l!Daon+KYMxfQCoIX=W2;}($yv97l~M`_FX*H@WHJ#vLFDdfb@I+w zck34`Dc%Qn^RJ|&|5=EDPCg3x_w15VCuyZ~{AEJ14?6kr{@7Wv5403I2_(VA4JN3S zF=BF%`Qy7xmaBS>_GU$NPvd9F)8U0X8n&|E#7#E$buQ!cW||(loF2%ZztF-FbmSzg;PXc7&9Pn=JPXGE-b zmiU911GKJZTR;Dz)LA{WNa$lNB$ed7TTE}Ip@5U~Wmt=&PjOn(eVRNUwIhnUFV%Nn zE%h6>(>cV{vh%!T#+l1=9b=Zh>1@XEWLLxpy%Rsg)mMhGDy#~KQOSL&L093>eW@ib zO4S%j+>a0?|mq?hP4f|W68UJdE?gUjaxVFyv1v^CuVky&)ni&F}~G)r`ql9liRkF zv1{`!-u7+VH{8^o**JZRH$A>%=Z5j?uA6CJH@>qS<-TfW<4ruiqJ4|^>Wy1>R)U$C z@msuWuirJZV@io#ZTtPj_S9CFx@LUmt{J_$X4h8zymFiUv}QKi6FIB4T(WBFl2x~O zV;7}TsmyCKH+y55*Ibl&4e7DW%@<{EPLXxhwwu(97wo!j*N&auuB|&ZUbnS9mD+Lr zwwayYb?u!S7~ys8ne8)ltNU6Hm*tw9+gsX7Wuw&9lRLfX&D+LzdUVj+MX^$0!%nX| zUaH^WP0wuGvSH$uo$VdoHElJv@mJcZEwrDSXs5<^rZ%?$QYxQIxiTtVv(neMZ{DzD z=ZqI@pYd*LPww0{Ll?KUXU3KK`S#|Glc~)cCuTrIsy#D9UKg%bS88f}=Xj^3&FvjK zQai67-^!nM>bjY2ySAsc%}ljtJchAtf?uH1-lD`c?d>~Vs?nZwi4LeHuOFZBHg4Oo zVPbqod+pjudOzd6lK=V0TlMm_t6sTw)itSA+r9RUyT&(f*ttzOgD$puJ9bX3UE98S zlFB!3+v;uDFnRO%hU=i8sSV?kH}2Xv(@ssbcQQ_3G}E4h7&hM2PKn|+j&I)hE93SR znD>MYW=m3#9yQZ`m<9vyriGUAy+C@y*_4G`KZ&S&l{>rKj2s=N%wUj&I$zb>n2WZ1zmb z0%U65FnRsP%~Kn8Z1SL6Z*zO=bvv*3w(r_;y}&nly@;|)a+|kpz0N`GwU7Wr>BuNd z1N)7Wq7A(;xb~)ZWlIYl^SSVG=eBFQb%jZW>aDssb0vTIze_=D*R~=;T$_6NR=~5- zk#3h0PEjOck&_o0-@JL-q$v5)YhSi@ZTQq)E#}y;Gqv@lsh`>UGbvF^dum5&%lOS3 zx9r-I+OccYAu0sfk_F)9sngr@e*h*S9A( zA@mwzOX%0wbL+O96b@;;J>?xoD;sugh2f@P`{Q11-_-kRa@$OMgQ{8m($w_$#?6#& zZ{M(ed}e&hh8>8t@vXP;v~gy-`yT1)jZaN^u($-eSG)3>4X?WTRU7!t=JJ*7Ww{Nn zd1YhmHJ1ltxngOdQ8GtHx8SCQ_@W zQmZbHgwB8TUUl^~FMo{}<#<;GS9z~`r5C)?d)2n>*GyiI0DtAHt`w(rA8O*I?&Fp9 z4Z)RHdRGQlUFN;~s+RYvpMUu;1lKk-k(z zZ{%v3T&8Gl#8uarr0W1YfUekZ&Fz)Q_PjK)mAA}ZqPtJ$W$u1a-mf!7OSONBh$!KtGP_A zl%?iIP|DV7je5CN%oM75dezEibJ={gP;3;-&0WpOkIVUNwcIFI3%OFYSjt!Gg;r1v>X}wOU#jS-S}qrA z)l4zS7Ml4W-^!M=wV+j-EfLZ__(s+ z6s?@@y{wUJ=`=N*x`3+4=T1|_sSC(jIK?0%`^yzGMb@j@F74ps)b)f`+^Gvmqn<%m zPF>6?j+c2EL}Z~@Dp#srHXFdXxmp&Ah4nJEN~W64WE+htTvMzROSOC^->g)ET%!!d zwh#!pa;;dZH)@4uu1PO1{#{1*KL#TdC)ZCHh%t zHe13YqfQaVu6k|YSl6Wl2FQK3YB`1AJ{cpt2Zvg?qm z06d7OGXoRz=F>ie*GeD^n>oo3#?7$+dtr(ybWeD!_*^ zmCN-)F`F$G>Pbh$XO_&1JH+RyimaB!30UY#Edzv#Zq_ z;|5bzz|kyKTGb4)TOz+v51QqCBU`OEviW+p4nRu9957u6+8YS=e5+X~G;&pj!g%WW zO3NdGk9=_(651;Oru`N*UFH56T&DKfmyDO z7OPk3GGx|hq8OmA79$sRpe!2Txgv4~g!wEyP^#9ltx6MWYz3ew*90NuVwSH(+_^@B zal?5ivN{x5Eung|g<8-m)N0vUxh2}j)N;@xv|KKuwsM7Rrc|yq^VJM=x-LsT+Bj3L zLhj{euAD>f)uB>spJFZ3pw&jb-e@#ok#Y-FS z2^tRtmn$%k3JSl_$XBx{(mFx_MDnMR%T>Kht`Gz{iHAxHzRl81MJ5DPSA;B}wkG1D z0i+A`83O|{S8e5h*5S|$nim)V^GvZ;L)jNdNXueKKr&JIo4^TWz z3*=E11}-$w_Xs^;QU;~vQjo)(Xpqq?6bt1H>{SaODYB7L&>5W43QD<3D_e)$s?7?N zmdh6N3?EaZRH~x%v!!ea3DYdYm>Fal)CEI84D~WlYZkqHtKdOeRR|NSA%{rI6J6( z8uYs^n@4z*0_0({S*&CkA#?(9mP@T#p;XCdb2-Fvsh%qqS{O_X45CaaU&td}fOWpm zz>+DIvsp0R3Mw^3BlHXd@V zPa-1<87Z$?sSz~msKQFC*{H$xCF-w3vOu*4UFEXbCTOUM#!GN(0U%@=g`kCPSgtk7 zrDCR72eUx~&4PO6>k>o_#-VGJQ?-^uGH3Ipd_E|)GV74unOapsrH%z%uVDq3sZk;V zy^Xwr7b{*k-boS_1;AKpU9VRb)uES-`WP>n+-C07Ybr>ck$XL1;m?mCMwF zTC+qii)b=YVWu1)&+tu}MKIi`1;t8v9Rjx&V1#F((gwp9^cqcQ8BlQMX_0KBHRiMWIl}5D$Da|6q+?GkQ@>@2%0rMfuQr42Gug|PN7`Qmr;tfCW5vB zq2N9g@~s-GzL9Iy!AnV$RfTrwiS#<&M74?Glt&4J$vU<{i@NL0N;VI_1&vHLThHcm z>wrz6go6bnkkO4Myn{%i@+KMsi4I0_sA`n}2Sa$o2m>8R_$>TW!0xFwP}d;0hGv%M zhjyq}fYB<91bgqnusf$j_nF5-N z8cR}urA)!1w%6rcc#L1deH-{0%efa>Z^tHrkQ=Vcx;I%bQ-LT8=-oV?Vy1=lUTx+x z%?8}qz~Cyh>R6*0>^}TubUdiUAgV|-&~(1pfJKqo1<1dGQICYIqjxcm3&?s%KkK2n zvblPpj&j6VuH}%>sE$Gg8HH<&y1)vPxg}|wVIa*Wwq+jORBI90(~{bC+qA|a)lnAb=d5RW)6RD(>uv95?7$>%fJ(P)_*$__|1%NVJZW-W_!fHshE zMPxXff>DlF5y0cvzVNHm1XNi^M3yj=T9s-R<2_%g74um4B`hz*dJWxGkv_oql;MYU zoUc(7p^s4tmlrV%k%=`TADJf3RwF3zR#rZ|SjIWR7^cUS93g@R1~8fs-CZcQut!Sk z5G3#^wh3wqae;QM*D;A&m0YgUfa^;#!mC)fSZ%dhrieX>?boWK@hB(zg>j;n&{ddc zjRtg?Eg<`|&@RURI@q8I?8=BmViJuivKR#(5NE+AAcTUUUBrL}L>UE5AdEUXw}vIt zDvAlKSPO6k0-8 zRx$k8$YZ9$^XLp+?ck@lrl z3z94b1?=l4HWV5iZ=zX4;WZ$~JoXX9O6;kHU5wztFhC4oLZASV9gt*GE)#;FUcnE_ zqv*gN?bmR{5a2LcU9q25ErT?ugU}+C1+{vyT+Gx9$nz>LE8xSBXkms`F`6rR+#DiR zRn&ShUqsaRU=VZ5V!TLtwz877ME(k5nxN6j5)&krCitPnGw3(m6=c%1A|Y(PL^;!pq+dJ;f1*ZSwk)jT&65cCR898(Q-)Pf@E_6 z;{=Z%sRx;$%P`35NN+e15k*i*u7pCP_zL2)282>UvEZ+jnuwe_Az-{BBn;BBwGIoA z{-Q~OJl?+9J`AABD=b~?7y5)WMC2f-Ft0GAOT=D~ZG>@&GBpqagpo_-I;4g%M0h3# zK|{C1g@`h&!)RfQk|F`TNV}-aR$q1!egs zNMNK@5qBV;Y2b<=`hXq+5%(&U@6!ZPR8;xnJqQgz#eX4;ShvE@Z?}kNE)ji zCxVz7o-hstuZc)-k+vxZ&mEIF#slYx6 zjhggD2C)Ts68Q&ZbUC{Y-40I^3!`EnT!0`-s2t+?MI09R7gENz#!SHL%JX#tQ03uQ z%nIz;DzTpe`nw>*64i?@jDw6rgCUKu0YDx~1XB%%Ehhs7_W(^_hrlpgFm0G!!J~ji z0xUR`BvUdtz14td0FfD@c*LOc1S*-vA^w3$SB38L$ONJ%wF=W3S+9)E7Z3!4r5b1s z1$nCt<~uSPBQX*TGmMi=uGNAQ@g4ZJe>4}tKUr@q>s_@=^XjQ>(<$biwe&&Le@ts0 zzX%}fwK5(G6moRMwVoRBc>1=soe7stnm;@`i()46|iV)&tr814dI$bG`PfeG{+nLGo zbagzJsZ5q83e&mFcmb!OP|nfg>f}UaO6GR1G+vz!|6xeu>z?BV+G{G~6Pe<4WnyZo zSeTq@BjIq=+vO5tX~WEulezL_eyTJ*F;&JgoSvM*7eoV(mzmVdWhOJ@NLT_f?c!uf zpciLF18CG6DJa&mgSJyn`&j}!l!E>2IBvW3ZsY+<6%E>9QQm275w zJeQloxT#EIj89;RAYZGXxH6TQCdvj#DwVb%X8#o1Q`t2c4>XJu49K?WOL@9of`TTp z6XWFxy!*n$_~cYsrgvciTwvT}a}!jR&rIdUsdIw=i4(WSC+Ky1f(WI0KT(}-N23@Y zFXh)wKF3W|r`KsD&*?ZS(-Y6_C}=<|@m%7fIz_}b_uRGtBRgc^Pe3=5vDz3>iAS4KT(>TE`!90X>6SQ z6e1^^9iIZ%Swuv>Jf3Ycsaru_vpL`qCEHb1P~H7ax>mhgVN%KM3#FzR#{1eKnQ_E1wlhd0t6Ehk_Cdr ziU^b{tw;eQL`4aTqDNY>;?cs!D4^mUEGjBmdWxr3@pi<@Dd+o}c_*2@Bt$u%{&n8) z-S_sq&-1*OnVp?|cQ}8>tkTj8tSqyWFJeCs7YyYU#g(OVQatg za%Qn*Zgxp!kd1c9Q)bO5)DF31Hm9-ur-zm8_fN0NpHo>-LHjEIz{YKh*EmHP5fW)5 za!pNUcE8D`RcVb4xazR%B7a}+HkwEUe1`Jut7*oHe_-QQn=otKBK0)3Er$6Y>0PvZ zPDF=edy_M=RbnM2)@*BbNyHHO2Q_WyYNmfte)efZ$ z_xrWCC_h+PP!g=lEX>HDEUj?|s|s|Abei||=WB0tP%J0{9 zcW;k7ZetAQ|lQ`kS zfu^uEa#%)oN^T%4FU1PX|0uTBSvP8${w9FW^8WWRaaj#Zv3?c zlle$7W$Lt&={J;?%_y&!Sy>gFHG59=+#4_AaU+(MW0*uN6e?^22eHw0K4}+{qyq~- zPVo&0DWeca_lTS}O|tVTb6HASA;b^qX>03LeystW`zgOOq2}V-uDCOO(9GAq4?Vg5 zy(d4J@Z8mDUv&LqeBFY}m+!g0`^K6_I_!;`aBH`%i~KzsZc4l=c-_{@fBx=+`46?< zw>ZH3t?C+xq$Td+Iyyx<9dJdGAkB9$6S1vG3tc6W?9(-R!YrE~_cq?%%Mp zSKCcHZXUnwE8qU@!|r@&&zQoO+E2aUf}}+qpXxQZ$C;@|%6gAF>BPagc~u>YpXoS# zcIu1I-Lj~6wGm zmkv5RYtHaqPd>Y;{}YMb(?&e9H+%F;wG+N7Po4JJf;)och3l)6s&_7oZ?j|RKaOr) z_P5fUx^LHgxAn{FncHI@8`GkWjcJj`1_c}&*4hm|Yf`08W2Z z7has{s3p_b*C8Asn~!4~x~9FE+OmgR!3+_aYE7y?J%vXv@BQT%8f%#p^kVx@q=L2^jb@6R)Ss}MI^dfojX$BwqpklmjoZ>3GI3DS?$$EEd#fFn&Ru>Y0yy(P;0fJ0YVAV z=CcCNAjc2n13QRMPNc%JUlQzBrK$TyGM&)*cVtdPgohOp5<2PC;+49`sf+7^KH{@G ztK5D`=%OV5ZIS+UBh{^2H!JWZLY>^4Es$UZ)_sNsJbIk?WE{2REmoXPINrW589e%g zxL0g%J-ct6cNd-_@;R*@wgT@FpP(Ou^WQ73J(S{mtKA#Hd#!8k`QwH2E5>#{di1hh zvRDKM+v0F94)Vou){rYYTk}`dSk_11oNyX-17IfHfSy;sKYDceHuRYw-9IQ;ac$bR zJE47t_yp6eqc8EqPMy1S?RHYq$)}up+UaMU+5N1u&q?la?s<;DvFd-2_5XWe`qQpM z+xBMFve>K;Lm6rZl!e+u2Z#rjbcpc|F|#42GQ^q+v6e!tn-Gg7#8M8iMnWe+5}XXD zz^TAIgiePu;7sTaXTjNU4lo^0@J7;r{RZqeV7~$T4cKqMegpO!u-}0F2JAOrzXAJi zVZQFldUWsJ=nYNzuuN7=meT| z!N1D>&#^TRZh~LH%{jBbNx^~?xK{6oRZ8L+4f=0!L4EP{+ikT zMWKp7!>OZMX$`-d*08BeM^cJOOV&+GR`ohkb)+jj%9GZSnG7no?VGfY?k4%brd6rF zciKuQyrM}+iWD~A;j^|8hoBx5l9u_b=ZG6XWzWM4upM^5PIwVsf|o&I9(r~WzXEFW zD!c}-!yE7>yal^KAqyLOh~Eau{|WZOJMb>N2MQI)?IV64B=-S)2>an9_!zW4wN|x8 zi$Otay#TbfwT9htjfn=_osh`Mp~@cIV~v~iNPn`C*RkfNrPEEfq{o%fVo;FI)=hk1 z#p+bwT?v=|+GqWlMhBoC%pxDCUrm=5513L=SZuHGbUqOFL{C2a-<YwhnjQ<>!}_ zRWSXQ)?F>_G~Z2jN=um~`%Z=GL(SA{RjGb|c)eM3_I(c9FN+gIWZ&F%Wo!=Sp$`@M z>dU!3;`r5{b{@Z)WMtU*KF-J}zZ*X~GUh(0C!a`sB6I?Uuc_}$x(n2k?@HVaP6CBx zcRKT$M82N<$;79?sc;&c4rjob&>hZ#v*8?Y$BusRJPW#^yGUszRl&;Qf-)W^kY5sX zp7;^_Mzno9$>>PS&u`S?IZk+6G{x?bqMJxp@W;z7ONFe(Q9pH|^?annIik7egQLLtp3z{lVLfidpW=l^@5< z*;=A!j$-f3b;D14hCJQuO__qqx0rHoH~Ui`IP_quZ(Cf_3a6U`=t4bB1`-c~!H@=* z0RPLBbt(J|BD?9#R;+HecDB^brrA1RT*s8B_)IXGBSR(#wCqOF84fr>Ni3(!{> za-+X*pZt8+M7|#3QeIgw)j4B2?_URz)hsR{R%i?Ed+L75G#rWa#s1JMfmP_n|ItuS zHivi&jD=jtgR9_b&^So`8q(unJX{MCU?N-xQR8qNM`tsgwdY>vpgr_MeO;#h5MuT9 zu&1we_sUG>P#CB6}U4)fq9_yyby^WheVWpj=h2iaVB44X-JJN;aMu6k_V zO1uyj!D9F&EP-FaZE!m@W3#cJhmT=%i?O*BUG>=fHSuqn^rqQUdb}qx`_fx$!%@Vt zu#bsV*w(n@5G#bu1!aMKPjHHko4DE;mOG4#%ZTrc>EdymW5Qi*JhfbcZMpb$3>WjL z3*7Q#s&94N8pp%s#>3wduZZ&Sc+V>O{9+HHt;ik34~&O3#F2w|SRU5>L4#OlTwG~f zTt$3WOc#I5$;DlTVJ4EjHz9uXHRq>6r%7<=&%<)ODq) zD0YX0&5_1Z zLH$x&*;AR)Wgx$mmJbS}K|V@G>m{;2+m!2`YjZl%O`Y^KC*vJg#O!&Htn4YcW8nJb z9V^wl{nxxGxOsOBy3X)MYjZWw zbzn=^t&;ire$H2MmUTZo0PCO**29DF5Nv>l;StyfkHTYMF5|4;5BRKqC;vF;dReG! z6Zzjk?OM{%P6i1<>V8l86L17sp|Z{7pM+h=?uSH2+)7;Mv;IK&Qy?AEud*%VpN6l= z3zhu``Dfq=?Q78aD1=})^rWv{K%oNJXOa6Oxc%NrdK-BA9U`xO*Ms`~9GG{2G-t~i z+ZCF-&ww4>vsr>oZFF$oIR-TDb#v}lw9wqXb_mhlZQIWnbv`mT-%{^EM@(OF+1gCH zErS%Hr@S?K(iuAiuO4@9ymRl)gLm#*JLj%n{Juo{02x&KZceiuRR8wjS6lpQ1G1@D z>!=M2)795B);#x?=k3(-{8iz%J{W3C$WdnUjL=^QNAi1ApIg^@)EoZxxuui=i5@R z&yTw`E`*-zefFEoF63STg-w(#C4QCsYj%6TzqEWROU8Mgua37QWMoHSqS5iX(UHp& z{>(E<^9w4c&axj*jGWq~BP*K<%S^jBn%ebsoJDp}?eXq;-L%@qp;GU<56Md5tLM&t1(aK~dW>385= zcn=hoA}_gp;FWuy{0HzMgpVQfSyd8iiP>wW2z|1xaM0-9AEEmr@*l&WqjdB6X?9sm z<(lu1NB0ubzXKlKe~Dw0!<(tT`x11rH+iL7BCZ3NS)fbRnLiz~l&qyn*F!`h#eD=Gi z@~6S;AU#tkSKFb)J5BikQ&&To^@t8@afC{`P_cd_#{P`%P_ zy?hbRn|5lewEVlQ)bXz!@icU)Zxy5!DolPOc_zlrt4(^D(ryf%D-gn zxbq{uYNPya+ADv6*zUWr=jK(fa@kW_vDzx_>i^u>%cD&8I+r{BQeIR)$`uD~x>Hw9 zovyh05G&a8O}&ET(mk@jM@DnLlDL*~>3+wwt26m;$xDawc0ce{dXyfA%_ZQL%YM%a z$JX%2e*7`L0(&cA72E~#u^)PMOe@sI&|O3M-LM+gKrP$@k>`thDZ3BW!u=rKBaH6A VzJ2V)%6go8KP%oRHUH@e{|kOqeX#%l diff --git a/.dist/npm/browser/index.js b/.dist/npm/browser/index.js deleted file mode 100644 index 832b12c..0000000 --- a/.dist/npm/browser/index.js +++ /dev/null @@ -1 +0,0 @@ -!function(n,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.clvm=t():n.clvm=t()}(this,(function(){return n={513:function(n,t,r){var e,i=(e=(e="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0)||"/index.js",function(n){var t,i,o;n=n||{},t||(t=void 0!==n?n:{}),t.ready=new Promise((function(n,t){i=n,o=t}));var u,f={};for(u in t)t.hasOwnProperty(u)&&(f[u]=t[u]);var a,c,s,h,l,w="./this.program",v="object"==typeof window,d="function"==typeof importScripts,y="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,p="";y?(p=d?r(794).dirname(p)+"/":"//",a=function(n,t){return h||(h=r(33)),l||(l=r(794)),n=l.normalize(n),h.readFileSync(n,t?null:"utf8")},s=function(n){return(n=a(n,!0)).buffer||(n=new Uint8Array(n)),n.buffer||Z("Assertion failed: undefined"),n},c=function(n,t,e){h||(h=r(33)),l||(l=r(794)),n=l.normalize(n),h.readFile(n,(function(n,r){n?e(n):t(r.buffer)}))},1=e);)++r;if(16(i=224==(240&i)?(15&i)<<12|o<<6|u:(7&i)<<18|o<<12|u<<6|63&n[t++])?e+=String.fromCharCode(i):(i-=65536,e+=String.fromCharCode(55296|i>>10,56320|1023&i))}}else e+=String.fromCharCode(i)}return e}function O(n,t,r,e){if(!(0=u&&(u=65536+((1023&u)<<10)|1023&n.charCodeAt(++o)),127>=u){if(r>=e)break;t[r++]=u}else{if(2047>=u){if(r+1>=e)break;t[r++]=192|u>>6}else{if(65535>=u){if(r+2>=e)break;t[r++]=224|u>>12}else{if(r+3>=e)break;t[r++]=240|u>>18,t[r++]=128|u>>12&63}t[r++]=128|u>>6&63}t[r++]=128|63&u}}return t[r]=0,r-i}function k(n){for(var t=0,r=0;r=e&&(e=65536+((1023&e)<<10)|1023&n.charCodeAt(++r)),127>=e?++t:t=2047>=e?t+2:65535>=e?t+3:t+4}return t}var U="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0;function M(n,t){for(var r=n>>1,e=r+t/2;!(r>=e)&&W[r];)++r;if(32<(r<<=1)-n&&U)return U.decode(P.subarray(n,r));for(r="",e=0;!(e>=t/2);++e){var i=N[n+2*e>>1];if(0==i)break;r+=String.fromCharCode(i)}return r}function T(n,t,r){if(void 0===r&&(r=2147483647),2>r)return 0;var e=t;r=(r-=2)<2*n.length?r/2:n.length;for(var i=0;i>1]=n.charCodeAt(i),t+=2;return N[t>>1]=0,t-e}function S(n){return 2*n.length}function I(n,t){for(var r=0,e="";!(r>=t/4);){var i=$[n+4*r>>2];if(0==i)break;++r,65536<=i?(i-=65536,e+=String.fromCharCode(55296|i>>10,56320|1023&i)):e+=String.fromCharCode(i)}return e}function x(n,t,r){if(void 0===r&&(r=2147483647),4>r)return 0;var e=t;r=e+r-4;for(var i=0;i=o&&(o=65536+((1023&o)<<10)|1023&n.charCodeAt(++i)),$[t>>2]=o,(t+=4)+4>r)break}return $[t>>2]=0,t-e}function F(n){for(var t=0,r=0;r=e&&++r,t+=4}return t}var C,D,P,N,W,$,B,G,q,H,R=[],z=[],V=[];function J(){var n=t.preRun.shift();R.unshift(n)}var X,Y=0,L=null,Q=null;function Z(n){throw t.onAbort&&t.onAbort(n),g(n),E=!0,n=new WebAssembly.RuntimeError("abort("+n+"). Build with -s ASSERTIONS=1 for more info."),o(n),n}function K(){return X.startsWith("data:application/octet-stream;base64,")}if(t.preloadedImages={},t.preloadedAudios={},X="blsjs.wasm",!K()){var nn=X;X=t.locateFile?t.locateFile(nn,p):p+nn}function tn(){var n=X;try{if(n==X&&b)return new Uint8Array(b);if(s)return s(n);throw"both async and sync fetching of the wasm failed"}catch(n){Z(n)}}function rn(n){for(;0>2]=n},this.ob=function(n){$[this.Y+8>>2]=n},this.pb=function(){$[this.Y>>2]=0},this.nb=function(){D[this.Y+12>>0]=0},this.qb=function(){D[this.Y+13>>0]=0},this.cb=function(n,t){this.rb(n),this.ob(t),this.pb(),this.nb(),this.qb()}}function on(n,t){for(var r=0,e=n.length-1;0<=e;e--){var i=n[e];"."===i?n.splice(e,1):".."===i?(n.splice(e,1),r++):r&&(n.splice(e,1),r--)}if(t)for(;r;r--)n.unshift("..");return n}function un(n){var t="/"===n.charAt(0),r="/"===n.substr(-1);return(n=on(n.split("/").filter((function(n){return!!n})),!t).join("/"))||t||(n="."),n&&r&&(n+="/"),(t?"/":"")+n}function fn(n){var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(n).slice(1);return n=t[0],t=t[1],n||t?(t&&(t=t.substr(0,t.length-1)),n+t):"."}function an(n){if("/"===n)return"/";var t=(n=(n=un(n)).replace(/\/$/,"")).lastIndexOf("/");return-1===t?n:n.substr(t+1)}function cn(){for(var n="",t=!1,r=arguments.length-1;-1<=r&&!t;r--){if("string"!=typeof(t=0<=r?arguments[r]:"/"))throw new TypeError("Arguments to path.resolve must be strings");if(!t)return"";n=t+"/"+n,t="/"===t.charAt(0)}return(t?"/":"")+(n=on(n.split("/").filter((function(n){return!!n})),!t).join("/"))||"."}var sn=[];function hn(n,t){sn[n]={input:[],output:[],sa:t},Nn(n,ln)}var ln={open:function(n){var t=sn[n.node.rdev];if(!t)throw new jn(43);n.tty=t,n.seekable=!1},close:function(n){n.tty.sa.flush(n.tty)},flush:function(n){n.tty.sa.flush(n.tty)},read:function(n,t,r,e){if(!n.tty||!n.tty.sa.Ra)throw new jn(60);for(var i=0,o=0;o=t||(t=Math.max(t,r*(1048576>r?2:1.125)>>>0),0!=r&&(t=Math.max(t,256)),r=n.W,n.W=new Uint8Array(t),0=n.node.aa)return 0;if(8<(n=Math.min(n.node.aa-i,e))&&o.subarray)t.set(o.subarray(i,i+n),r);else for(e=0;et)throw new jn(28);return t},La:function(n,t,r){dn.Oa(n.node,t+r),n.node.aa=Math.max(n.node.aa,t+r)},Sa:function(n,t,r,e,i,o){if(0!==t)throw new jn(28);if(32768!=(61440&n.node.mode))throw new jn(43);if(n=n.node.W,2&o||n.buffer!==C){if((0>>0)%gn.length}function Mn(n,t){var r;if(r=(r=xn(n,"x"))?r:n.X.lookup?0:2)throw new jn(r,n);for(r=gn[Un(n.id,t)];r;r=r.gb){var e=r.name;if(r.parent.id===n.id&&e===t)return r}return n.X.lookup(n,t)}function Tn(n,t,r,e){return t=Un((n=new hr(n,t,r,e)).parent.id,n.name),n.gb=gn[t],gn[t]=n}var Sn={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090};function In(n){var t=["r","w","rw"][3&n];return 512&n&&(t+="w"),t}function xn(n,t){return An?0:!t.includes("r")||292&n.mode?t.includes("w")&&!(146&n.mode)||t.includes("x")&&!(73&n.mode)?2:0:2}function Fn(n,t){try{return Mn(n,t),20}catch(n){}return xn(n,"wx")}function Cn(n){Xn||((Xn=function(){}).prototype={});var t,r=new Xn;for(t in n)r[t]=n[t];return n=r,r=function(){for(var n=0;n<=4096;n++)if(!bn[n])return n;throw new jn(33)}(),n.fd=r,bn[r]=n}var Dn,Pn={open:function(n){n.$=pn[n.node.rdev].$,n.$.open&&n.$.open(n)},va:function(){throw new jn(70)}};function Nn(n,t){pn[n]={$:t}}function Wn(n,t){var r="/"===t,e=!t;if(r&&yn)throw new jn(10);if(!r&&!e){var i=On(t,{Qa:!1});if(t=i.path,(i=i.node).Ca)throw new jn(10);if(16384!=(61440&i.mode))throw new jn(54)}t={type:n,Ab:{},Ta:t,fb:[]},(n=n.la(t)).la=t,t.root=n,r?yn=n:i&&(i.Ca=t,i.la&&i.la.fb.push(t))}function $n(n,t,r){var e=On(n,{parent:!0}).node;if(!(n=an(n))||"."===n||".."===n)throw new jn(28);var i=Fn(e,n);if(i)throw new jn(i);if(!e.X.Ba)throw new jn(63);return e.X.Ba(e,n,t,r)}function Bn(n){return $n(n,16895,0)}function Gn(n,t,r){void 0===r&&(r=t,t=438),$n(n,8192|t,r)}function qn(n,t){if(!cn(n))throw new jn(44);var r=On(t,{parent:!0}).node;if(!r)throw new jn(44);var e=Fn(r,t=an(t));if(e)throw new jn(e);if(!r.X.symlink)throw new jn(63);r.X.symlink(r,t,n)}function Hn(n){if(!(n=On(n).node))throw new jn(44);if(!n.X.readlink)throw new jn(28);return cn(kn(n.parent),n.X.readlink(n))}function Rn(n,r,e){if(""===n)throw new jn(44);if("string"==typeof r){var i=Sn[r];if(void 0===i)throw Error("Unknown file open mode: "+r);r=i}if(e=64&r?4095&(void 0===e?438:e)|32768:0,"object"==typeof n)var o=n;else{n=un(n);try{o=On(n,{Pa:!(131072&r)}).node}catch(n){}}if(i=!1,64&r)if(o){if(128&r)throw new jn(20)}else o=$n(n,e,0),i=!0;if(!o)throw new jn(44);if(8192==(61440&o.mode)&&(r&=-513),65536&r&&16384!=(61440&o.mode))throw new jn(54);if(!i&&(e=o?40960==(61440&o.mode)?32:16384==(61440&o.mode)&&("r"!==In(r)||512&r)?31:xn(o,In(r)):44))throw new jn(e);if(512&r){if(!(e="string"==typeof(e=o)?On(e,{Pa:!0}).node:e).X.ja)throw new jn(63);if(16384==(61440&e.mode))throw new jn(31);if(32768!=(61440&e.mode))throw new jn(28);if(i=xn(e,"w"))throw new jn(i);e.X.ja(e,{size:0,timestamp:Date.now()})}r&=-131713,(o=Cn({node:o,path:kn(o),flags:r,seekable:!0,position:0,$:o.$,Cb:[],error:!1})).$.open&&o.$.open(o),!t.logReadFiles||1&r||(Yn||(Yn={}),n in Yn||(Yn[n]=1,g("FS.trackingDelegate error on read file: "+n)));try{En.onOpenFile&&(e=0,1!=(2097155&r)&&(e|=1),0!=(2097155&r)&&(e|=2),En.onOpenFile(n,e))}catch(t){g("FS.trackingDelegate['onOpenFile']('"+n+"', flags) threw an exception: "+t.message)}return o}function zn(){jn||((jn=function(n,t){this.node=t,this.mb=function(n){this.ua=n},this.mb(n),this.message="FS error"}).prototype=Error(),jn.prototype.constructor=jn,[44].forEach((function(n){_n[n]=new jn(n),_n[n].stack=""})))}function Vn(n,t,r){n=un("/dev/"+n);var e=function(n,t){var r=0;return n&&(r|=365),t&&(r|=146),r}(!!t,!!r);Jn||(Jn=64);var i=Jn++<<8|0;Nn(i,{open:function(n){n.seekable=!1},close:function(){r&&r.buffer&&r.buffer.length&&r(10)},read:function(n,r,e,i){for(var o=0,u=0;u=t?"_"+n:n}function ut(n,t){return n=ot(n),new Function("body","return function "+n+'() {\n "use strict"; return body.apply(this, arguments);\n};\n')(t)}function ft(n){var t=Error,r=ut(n,(function(t){this.name=n,this.message=t,void 0!==(t=Error(t).stack)&&(this.stack=this.toString()+"\n"+t.replace(/^Error(:[^\n]*)?\n/,""))}));return r.prototype=Object.create(t.prototype),r.prototype.constructor=r,r.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message},r}var at=void 0;function ct(n){throw new at(n)}var st=void 0;function ht(n){throw new st(n)}function lt(n,t,r){function e(t){(t=r(t)).length!==n.length&&ht("Mismatched type converter count");for(var e=0;e>2])}function It(n,t,r){return t===r?n:void 0===r.ha||null===(n=It(n,t,r.ha))?null:r.Ya(n)}var xt={};function Ft(n,t){return t.ba&&t.Y||ht("makeClassHandle requires ptr and ptrType"),!!t.ga!=!!t.fa&&ht("Both smartPtrType and smartPtr must be specified"),t.count={value:1},bt(Object.create(n,{V:{value:t}}))}function Ct(n,t,r,e){this.name=n,this.Z=t,this.Ha=r,this.za=e,this.Aa=!1,this.oa=this.kb=this.jb=this.Va=this.sb=this.hb=void 0,void 0!==t.ha?this.toWireType=Mt:(this.toWireType=e?Ut:Tt,this.ka=null)}function Dt(n,r){var e=(n=tt(n)).includes("j")?function(n,r){var e=[];return function(){e.length=arguments.length;for(var i=0;io&&ct("argTypes array size mismatch! Must at least get return value and 'this' types!");var u=null!==t[1]&&null!==r,f=!1;for(r=1;r>2)+e]);return r}var Ht=[],Rt=[{},{value:void 0},{value:null},{value:!0},{value:!1}];function zt(n){4>2])};case 3:return function(n){return this.fromWireType(q[n>>3])};default:throw new TypeError("Unknown float type: "+n)}}function Yt(n,t,r){switch(t){case 0:return r?function(n){return D[n]}:function(n){return P[n]};case 1:return r?function(n){return N[n>>1]}:function(n){return W[n>>1]};case 2:return r?function(n){return $[n>>2]}:function(n){return B[n>>2]};default:throw new TypeError("Unknown integer type: "+n)}}function Lt(n){return n||ct("Cannot use deleted val. handle = "+n),Rt[n].value}function Qt(n,t){var r=et[n];return void 0===r&&ct(t+" has unknown type "+Nt(n)),r}var Zt={};function Kt(n){var t=Zt[n];return void 0===t?tt(n):t}var nr=[];function tr(){return"object"==typeof globalThis?globalThis:Function("return this")()}var rr,er={},ir={};function or(){if(!rr){var n,t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:w||"./this.program"};for(n in ir)void 0===ir[n]?delete t[n]:t[n]=ir[n];var r=[];for(n in t)r.push(n+"="+t[n]);rr=r}return rr}function ur(n){return 0==n%4&&(0!=n%100||0==n%400)}function fr(n,t){for(var r=0,e=0;e<=t;r+=n[e++]);return r}var ar=[31,29,31,30,31,30,31,31,30,31,30,31],cr=[31,28,31,30,31,30,31,31,30,31,30,31];function sr(n,t){for(n=new Date(n.getTime());0e-n.getDate())){n.setDate(n.getDate()+t);break}t-=e-n.getDate()+1,n.setDate(1),11>r?n.setMonth(r+1):(n.setMonth(0),n.setFullYear(n.getFullYear()+1))}return n}function hr(n,t,r,e){n||(n=this),this.parent=n,this.la=n.la,this.Ca=null,this.id=mn++,this.name=t,this.mode=r,this.X={},this.$={},this.rdev=e}Object.defineProperties(hr.prototype,{read:{get:function(){return 365==(365&this.mode)},set:function(n){n?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146==(146&this.mode)},set:function(n){n?this.mode|=146:this.mode&=-147}}}),zn(),gn=Array(4096),Wn(dn,"/"),Bn("/tmp"),Bn("/home"),Bn("/home/web_user"),function(){Bn("/dev"),Nn(259,{read:function(){return 0},write:function(n,t,r,e){return e}}),Gn("/dev/null",259),hn(1280,wn),hn(1536,vn),Gn("/dev/tty",1280),Gn("/dev/tty1",1536);var n=function(){if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues){var n=new Uint8Array(1);return function(){return crypto.getRandomValues(n),n[0]}}if(y)try{var t=r(135);return function(){return t.randomBytes(1)[0]}}catch(n){}return function(){Z("randomDevice")}}();Vn("random",n),Vn("urandom",n),Bn("/dev/shm"),Bn("/dev/shm/tmp")}(),function(){Bn("/proc");var n=Bn("/proc/self");Bn("/proc/self/fd"),Wn({la:function(){var t=Tn(n,"fd",16895,73);return t.X={lookup:function(n,t){var r=bn[+t];if(!r)throw new jn(8);return(n={parent:null,la:{Ta:"fake"},X:{readlink:function(){return r.path}}}).parent=n}},t}},"/proc/self/fd")}();for(var lr=Array(256),wr=0;256>wr;++wr)lr[wr]=String.fromCharCode(wr);function vr(n,t){var r=Array(k(n)+1);return n=O(n,r,0,r.length),t&&(r.length=n),r}nt=lr,at=t.BindingError=ft("BindingError"),st=t.InternalError=ft("InternalError"),Et.prototype.isAliasOf=function(n){if(!(this instanceof Et&&n instanceof Et))return!1;var t=this.V.ba.Z,r=this.V.Y,e=n.V.ba.Z;for(n=n.V.Y;t.ha;)r=t.ya(r),t=t.ha;for(;e.ha;)n=e.ya(n),e=e.ha;return t===e&&r===n},Et.prototype.clone=function(){if(this.V.Y||vt(this),this.V.wa)return this.V.count.value+=1,this;var n=bt,t=Object,r=t.create,e=Object.getPrototypeOf(this),i=this.V;return(n=n(r.call(t,e,{V:{value:{count:i.count,qa:i.qa,wa:i.wa,Y:i.Y,ba:i.ba,fa:i.fa,ga:i.ga}}}))).V.count.value+=1,n.V.qa=!1,n},Et.prototype.delete=function(){this.V.Y||vt(this),this.V.qa&&!this.V.wa&&ct("Object already scheduled for deletion"),yt(this),pt(this.V),this.V.wa||(this.V.fa=void 0,this.V.Y=void 0)},Et.prototype.isDeleted=function(){return!this.V.Y},Et.prototype.deleteLater=function(){return this.V.Y||vt(this),this.V.qa&&!this.V.wa&&ct("Object already scheduled for deletion"),gt.push(this),1===gt.length&&mt&&mt(At),this.V.qa=!0,this},Ct.prototype.$a=function(n){return this.Va&&(n=this.Va(n)),n},Ct.prototype.Na=function(n){this.oa&&this.oa(n)},Ct.prototype.argPackAdvance=8,Ct.prototype.readValueFromPointer=St,Ct.prototype.deleteObject=function(n){null!==n&&n.delete()},Ct.prototype.fromWireType=function(n){function t(){return this.Aa?Ft(this.Z.ra,{ba:this.hb,Y:r,ga:this,fa:n}):Ft(this.Z.ra,{ba:this,Y:n})}var r=this.$a(n);if(!r)return this.Na(n),null;var e=function(n,t){for(void 0===t&&ct("ptr should not be undefined");n.ha;)t=n.ya(t),n=n.ha;return xt[t]}(this.Z,r);if(void 0!==e)return 0===e.V.count.value?(e.V.Y=r,e.V.fa=n,e.clone()):(e=e.clone(),this.Na(n),e);if(e=this.Z.Za(r),!(e=jt[e]))return t.call(this);e=this.za?e.Xa:e.pointerType;var i=It(r,this.Z,e.Z);return null===i?t.call(this):this.Aa?Ft(e.Z.ra,{ba:e,Y:i,ga:this,fa:n}):Ft(e.Z.ra,{ba:e,Y:i})},t.getInheritedInstanceCount=function(){return Object.keys(xt).length},t.getLiveInheritedInstances=function(){var n,t=[];for(n in xt)xt.hasOwnProperty(n)&&t.push(xt[n]);return t},t.flushPendingDeletes=At,t.setDelayFunction=function(n){mt=n,gt.length&&mt&&mt(At)},Pt=t.UnboundTypeError=ft("UnboundTypeError"),t.count_emval_handles=function(){for(var n=0,t=5;t>2];else i=0;return Rn(e,t,i).fd}catch(n){return void 0!==Ln&&n instanceof jn||Z(n),-n.ua}},w:function(){},F:function(n,t,r,e,i){var o=Kn(r);wt(n,{name:t=tt(t),fromWireType:function(n){return!!n},toWireType:function(n,t){return t?e:i},argPackAdvance:8,readValueFromPointer:function(n){if(1===r)var e=D;else if(2===r)e=N;else{if(4!==r)throw new TypeError("Unknown boolean type size: "+t);e=$}return this.fromWireType(e[n>>o])},ka:null})},l:function(n,r,e,i,o,u,f,a,c,s,h,l,w){h=tt(h),u=Dt(o,u),a&&(a=Dt(f,a)),s&&(s=Dt(c,s)),w=Dt(l,w);var v=ot(h);!function(n,r){t.hasOwnProperty(n)?(ct("Cannot register public name '"+n+"' twice"),_t(t,n,n),t.hasOwnProperty(void 0)&&ct("Cannot register multiple overloads of a function with the same number of arguments (undefined)!"),t[n].da[void 0]=r):t[n]=r}(v,(function(){Wt("Cannot construct "+h+" due to unbound types",[i])})),lt([n,r,e],i?[i]:[],(function(r){if(r=r[0],i)var e=r.Z,o=e.ra;else o=Et.prototype;r=ut(v,(function(){if(Object.getPrototypeOf(this)!==f)throw new at("Use 'new' to construct "+h);if(void 0===c.na)throw new at(h+" has no accessible constructor");var n=c.na[arguments.length];if(void 0===n)throw new at("Tried to invoke ctor of "+h+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(c.na).toString()+") parameters instead!");return n.apply(this,arguments)}));var f=Object.create(o,{constructor:{value:r}});r.prototype=f;var c=new Ot(h,r,f,w,e,u,a,s);e=new Ct(h,c,!0,!1),o=new Ct(h+"*",c,!1,!1);var l=new Ct(h+" const*",c,!1,!0);return jt[n]={pointerType:o,Xa:l},function(n,r){t.hasOwnProperty(n)||ht("Replacing nonexistant public symbol"),t[n]=r,t[n].pa=void 0}(v,r),[e,o,l]}))},b:function(n,t,r,e,i,o,u){var f=qt(r,e);t=tt(t),o=Dt(i,o),lt([],[n],(function(n){function e(){Wt("Cannot call "+i+" due to unbound types",f)}var i=(n=n[0]).name+"."+t;t.startsWith("@@")&&(t=Symbol[t.substring(2)]);var a=n.Z.constructor;return void 0===a[t]?(e.pa=r-1,a[t]=e):(_t(a,t,i),a[t].da[r-1]=e),lt([],f,(function(n){return n=[n[0],null].concat(n.slice(1)),n=Gt(i,n,null,o,u),void 0===a[t].da?(n.pa=r-1,a[t]=n):a[t].da[r-1]=n,[]})),[]}))},p:function(n,t,r,e,i,o,u,f){t=tt(t),o=Dt(i,o),lt([],[n],(function(n){var i=(n=n[0]).name+"."+t,a={get:function(){Wt("Cannot access "+i+" due to unbound types",[r])},enumerable:!0,configurable:!0};return a.set=f?function(){Wt("Cannot access "+i+" due to unbound types",[r])}:function(){ct(i+" is a read-only property")},Object.defineProperty(n.Z.constructor,t,a),lt([],[r],(function(r){r=r[0];var i={get:function(){return r.fromWireType(o(e))},enumerable:!0};return f&&(f=Dt(u,f),i.set=function(n){var t=[];f(e,r.toWireType(t,n)),Bt(t)}),Object.defineProperty(n.Z.constructor,t,i),[]})),[]}))},r:function(n,t,r,e,i,o){0>>f}}var a=t.includes("unsigned");wt(n,{name:t,fromWireType:o,toWireType:function(n,r){if("number"!=typeof r&&"boolean"!=typeof r)throw new TypeError('Cannot convert "'+Jt(r)+'" to '+this.name);if(ri)throw new TypeError('Passing a number "'+Jt(r)+'" from JS side to C/C++ side to an argument of type "'+t+'", which is outside the valid range ['+e+", "+i+"]!");return a?r>>>0:0|r},argPackAdvance:8,readValueFromPointer:Yt(t,u,0!==e),ka:null})},g:function(n,t,r){function e(n){var t=B;return new i(C,t[1+(n>>=2)],t[n])}var i=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][t];wt(n,{name:r=tt(r),fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{bb:!0})},t:function(n,t){var r="std::string"===(t=tt(t));wt(n,{name:t,fromWireType:function(n){var t=B[n>>2];if(r)for(var e=n+4,i=0;i<=t;++i){var o=n+4+i;if(i==t||0==P[o]){if(e=e?_(P,e,o-e):"",void 0===u)var u=e;else u+=String.fromCharCode(0),u+=e;e=o+1}}else{for(u=Array(t),i=0;i>2]=i,r&&e)O(t,P,o+4,i+1);else if(e)for(e=0;e>2],o=u(),a=n+4,c=0;c<=i;++c){var s=n+4+c*t;c!=i&&0!=o[s>>f]||(a=e(a,s-a),void 0===r?r=a:(r+=String.fromCharCode(0),r+=a),a=s+t)}return br(n),r},toWireType:function(n,e){"string"!=typeof e&&ct("Cannot pass non-string to C++ string type "+r);var u=o(e),a=pr(4+u+t);return B[a>>2]=u>>f,i(e,a+4,u+t),null!==n&&n.push(br,a),a},argPackAdvance:8,readValueFromPointer:St,ka:function(n){br(n)}})},G:function(n,t){wt(n,{eb:!0,name:t=tt(t),argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},i:function(n,t,r){n=Lt(n),t=Qt(t,"emval::as");var e=[],i=Vt(e);return $[r>>2]=i,t.toWireType(e,n)},H:function(n,t,r,e,i){n=nr[n],t=Lt(t),r=Kt(r);var o=[];return $[e>>2]=Vt(o),n(t,r,o,i)},I:function(n,t,r,e){(n=nr[n])(t=Lt(t),r=Kt(r),null,e)},a:zt,v:function(n){return 0===n?Vt(tr()):(n=Kt(n),Vt(tr()[n]))},u:function(n,t){for(var r=(t=function(n,t){for(var r=Array(n),e=0;e>2)+e],"parameter "+e);return r}(n,t))[0],e=r.name+"_$"+t.slice(1).map((function(n){return n.name})).join("_")+"$",i=["retType"],o=[r],u="",f=0;f>> 2) + "+u+'], "parameter '+u+'");\nvar arg'+u+" = argType"+u+".readValueFromPointer(args);\nargs += argType"+u+"['argPackAdvance'];\n";o=new Function("requireRegisteredType","Module","__emval_register",f+"var obj = new constructor("+o+");\nreturn __emval_register(obj);\n}\n")(Qt,t,Vt),er[r]=o}return o(n,e,i)},m:function(n){return Vt(Kt(n))},h:function(n){Bt(Rt[n].value),zt(n)},n:function(n,t){return Vt(n=(n=Qt(n,"_emval_take_value")).readValueFromPointer(t))},q:function(){Z()},x:function(){Z("OOM")},z:function(n,t){try{var r=0;return or().forEach((function(e,i){var o=t+r;for(i=$[n+4*i>>2]=o,o=0;o>0]=e.charCodeAt(o);D[i>>0]=0,r+=e.length+1})),0}catch(n){return void 0!==Ln&&n instanceof jn||Z(n),n.ua}},A:function(n,t){try{var r=or();$[n>>2]=r.length;var e=0;return r.forEach((function(n){e+=n.length+1})),$[t>>2]=e,0}catch(n){return void 0!==Ln&&n instanceof jn||Z(n),n.ua}},B:function(n){try{var t=Zn(n);if(null===t.fd)throw new jn(8);t.ab&&(t.ab=null);try{t.$.close&&t.$.close(t)}catch(n){throw n}finally{bn[t.fd]=null}return t.fd=null,0}catch(n){return void 0!==Ln&&n instanceof jn||Z(n),n.ua}},C:function(n,t,r,e){try{n:{for(var i=Zn(n),o=n=0;o>2],f=i,a=$[t+8*o>>2],c=u,s=void 0,h=D;if(0>c||0>s)throw new jn(28);if(null===f.fd)throw new jn(8);if(1==(2097155&f.flags))throw new jn(8);if(16384==(61440&f.node.mode))throw new jn(31);if(!f.$.read)throw new jn(28);var l=void 0!==s;if(l){if(!f.seekable)throw new jn(70)}else s=f.position;var w=f.$.read(f,h,a,c,s);l||(f.position+=w);var v=w;if(0>v){var d=-1;break n}if(n+=v,v>2]=d,0}catch(n){return void 0!==Ln&&n instanceof jn||Z(n),n.ua}},y:function(n,t,r,e){return function(n,t,r,e){function i(n,t,r){for(n="number"==typeof n?n.toString():n||"";n.lengthn?-1:0=u(r,n)?0>=u(t,n)?n.getFullYear()+1:n.getFullYear():n.getFullYear()-1}var c=$[e+40>>2];for(var s in e={vb:$[e>>2],ub:$[e+4>>2],Da:$[e+8>>2],xa:$[e+12>>2],ta:$[e+16>>2],ea:$[e+20>>2],Ea:$[e+24>>2],Fa:$[e+28>>2],Bb:$[e+32>>2],tb:$[e+36>>2],wb:c&&c?_(P,c,void 0):""},r=r?_(P,r,void 0):"",c={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"})r=r.replace(new RegExp(s,"g"),c[s]);var h="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),l="January February March April May June July August September October November December".split(" ");for(s in c={"%a":function(n){return h[n.Ea].substring(0,3)},"%A":function(n){return h[n.Ea]},"%b":function(n){return l[n.ta].substring(0,3)},"%B":function(n){return l[n.ta]},"%C":function(n){return o((n.ea+1900)/100|0,2)},"%d":function(n){return o(n.xa,2)},"%e":function(n){return i(n.xa,2," ")},"%g":function(n){return a(n).toString().substring(2)},"%G":function(n){return a(n)},"%H":function(n){return o(n.Da,2)},"%I":function(n){return 0==(n=n.Da)?n=12:12n.Da?"AM":"PM"},"%S":function(n){return o(n.vb,2)},"%t":function(){return"\t"},"%u":function(n){return n.Ea||7},"%U":function(n){var t=new Date(n.ea+1900,0,1),r=0===t.getDay()?t:sr(t,7-t.getDay());return 0>u(r,n=new Date(n.ea+1900,n.ta,n.xa))?o(Math.ceil((31-r.getDate()+(fr(ur(n.getFullYear())?ar:cr,n.getMonth()-1)-31)+n.getDate())/7),2):0===u(r,t)?"01":"00"},"%V":function(n){var t=new Date(n.ea+1901,0,4),r=f(new Date(n.ea+1900,0,4));t=f(t);var e=sr(new Date(n.ea+1900,0,1),n.Fa);return 0>u(e,r)?"53":0>=u(t,e)?"01":o(Math.ceil((r.getFullYear()u(r,n=new Date(n.ea+1900,n.ta,n.xa))?o(Math.ceil((31-r.getDate()+(fr(ur(n.getFullYear())?ar:cr,n.getMonth()-1)-31)+n.getDate())/7),2):0===u(r,t)?"01":"00"},"%y":function(n){return(n.ea+1900).toString().substring(2)},"%Y":function(n){return n.ea+1900},"%z":function(n){var t=0<=(n=n.tb);return n=Math.abs(n)/60,(t?"+":"-")+String("0000"+(n/60*100+n%60)).slice(-4)},"%Z":function(n){return n.wb},"%%":function(){return"%"}})r.includes(s)&&(r=r.replace(new RegExp(s,"g"),c[s](e)));return(s=vr(r,!1)).length>t?0:(D.set(s,n),s.length-1)}(n,t,r,e)}};!function(){function n(n){t.asm=n.exports,A=t.asm.K,C=n=A.buffer,t.HEAP8=D=new Int8Array(n),t.HEAP16=N=new Int16Array(n),t.HEAP32=$=new Int32Array(n),t.HEAPU8=P=new Uint8Array(n),t.HEAPU16=W=new Uint16Array(n),t.HEAPU32=B=new Uint32Array(n),t.HEAPF32=G=new Float32Array(n),t.HEAPF64=q=new Float64Array(n),H=t.asm.N,z.unshift(t.asm.L),Y--,t.monitorRunDependencies&&t.monitorRunDependencies(Y),0==Y&&(null!==L&&(clearInterval(L),L=null),Q&&(n=Q,Q=null,n()))}function r(t){n(t.instance)}function e(n){return function(){if(!b&&(v||d)){if("function"==typeof fetch&&!X.startsWith("file://"))return fetch(X,{credentials:"same-origin"}).then((function(n){if(!n.ok)throw"failed to load wasm binary file at '"+X+"'";return n.arrayBuffer()})).catch((function(){return tn()}));if(c)return new Promise((function(n,t){c(X,(function(t){n(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return tn()}))}().then((function(n){return WebAssembly.instantiate(n,i)})).then(n,(function(n){g("failed to asynchronously prepare wasm: "+n),Z(n)}))}var i={a:dr};if(Y++,t.monitorRunDependencies&&t.monitorRunDependencies(Y),t.instantiateWasm)try{return t.instantiateWasm(i,n)}catch(n){return g("Module.instantiateWasm callback failed with error: "+n),!1}(b||"function"!=typeof WebAssembly.instantiateStreaming||K()||X.startsWith("file://")||"function"!=typeof fetch?e(r):fetch(X,{credentials:"same-origin"}).then((function(n){return WebAssembly.instantiateStreaming(n,i).then(r,(function(n){return g("wasm streaming compile failed: "+n),g("falling back to ArrayBuffer instantiation"),e(r)}))}))).catch(o)}(),t.nn=function(){return(t.nn=t.asm.L).apply(null,arguments)};var yr,pr=t.tn=function(){return(pr=t.tn=t.asm.M).apply(null,arguments)},br=t.rn=function(){return(br=t.rn=t.asm.O).apply(null,arguments)},mr=t.en=function(){return(mr=t.en=t.asm.P).apply(null,arguments)};function gr(){function n(){if(!yr&&(yr=!0,t.calledRun=!0,!E)){if(t.noFSInit||Dn||(Dn=!0,zn(),t.stdin=t.stdin,t.stdout=t.stdout,t.stderr=t.stderr,t.stdin?Vn("stdin",t.stdin):qn("/dev/tty","/dev/stdin"),t.stdout?Vn("stdout",null,t.stdout):qn("/dev/tty","/dev/stdout"),t.stderr?Vn("stderr",null,t.stderr):qn("/dev/tty1","/dev/stderr"),Rn("/dev/stdin",0),Rn("/dev/stdout",1),Rn("/dev/stderr",1)),An=!1,rn(z),i(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),t.postRun)for("function"==typeof t.postRun&&(t.postRun=[t.postRun]);t.postRun.length;){var n=t.postRun.shift();V.unshift(n)}rn(V)}}if(!(0"===n?o>t:">="===n?o>=t:o===t))}("<",11))return console.warn("IE <= 10 uses insecure random generator. Please consider to use IE11 or another modern browser"),function(){return Math.floor(512*Math.random())%256};throw new Error("Crypto module not found")}return function(){return t.getRandomValues(new Uint32Array(1))[0]}}return void 0!==n.g&&n.g.crypto?function(){return n.g.crypto.randomBytes(4).readInt32LE()}:function(){return r(845).randomBytes(4).readInt32LE()}}(),f=function(){function n(t,r){if(Array.isArray(t)||!t)return this.i=Array.isArray(t)?t:[],void(this.u="number"==typeof r?r:4*this.i.length);if(t instanceof n)return this.i=t.words.slice(),void(this.u=t.nSigBytes);var e;try{t instanceof ArrayBuffer?e=new Uint8Array(t):(t instanceof Uint8Array||t instanceof Int8Array||t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)&&(e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength))}catch(n){throw new Error("Invalid argument")}if(!e)throw new Error("Invalid argument");for(var i=e.byteLength,o=[],u=0;u>>2]|=e[u]<<24-u%4*8;this.i=o,this.u=i}return Object.defineProperty(n.prototype,"nSigBytes",{get:function(){return this.u},set:function(n){this.u=n},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"words",{get:function(){return this.i},enumerable:!1,configurable:!0}),n.prototype.toString=function(n){return n?n.stringify(this):a.stringify(this)},n.prototype.toUint8Array=function(){for(var n=this.i,t=this.u,r=new Uint8Array(t),e=0;e>>2]>>>24-e%4*8&255;return r},n.prototype.concat=function(n){var t=n.words.slice(),r=n.nSigBytes;if(this.clamp(),this.u%4)for(var e=0;e>>2]>>>24-e%4*8&255;this.i[this.u+e>>>2]|=i<<24-(this.u+e)%4*8}else for(e=0;e>>2]=t[e>>>2];return this.u+=r,this},n.prototype.clamp=function(){var n=this.u;this.i[n>>>2]&=4294967295<<32-n%4*8,this.i.length=Math.ceil(n/4)},n.prototype.clone=function(){return new n(this.i.slice(),this.u)},n.random=function(t){for(var r=[],e=0;e>>2]>>>24-i%4*8&255;e.push((o>>>4).toString(16)),e.push((15&o).toString(16))}return e.join("")},parse:function(n){var t=n.length;if(t%2!=0)throw new Error("Hex string count must be even");if(!/^[a-fA-F0-9]+$/.test(n))throw new Error("Invalid Hex string: "+n);for(var r=[],e=0;e>>3]|=parseInt(n.substr(e,2),16)<<24-e%8*4;return new f(r,t/2)}};return t}()},915:function(n,t,r){n.exports=function(){"use strict";var n={3354:function(n,t,r){r.d(t,{e:function(){return o}});var e=r(5720),i=r(9054),o=function(){function n(t,r){if(Array.isArray(t)||!t)return this.t=Array.isArray(t)?t:[],void(this.i="number"==typeof r?r:4*this.t.length);if(t instanceof n)return this.t=t.words.slice(),void(this.i=t.nSigBytes);var e;try{t instanceof ArrayBuffer?e=new Uint8Array(t):(t instanceof Uint8Array||t instanceof Int8Array||t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)&&(e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength))}catch(n){throw new Error("Invalid argument")}if(!e)throw new Error("Invalid argument");for(var i=e.byteLength,o=[],u=0;u>>2]|=e[u]<<24-u%4*8;this.t=o,this.i=i}return Object.defineProperty(n.prototype,"nSigBytes",{get:function(){return this.i},set:function(n){this.i=n},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"words",{get:function(){return this.t},enumerable:!1,configurable:!0}),n.prototype.toString=function(n){return n?n.stringify(this):e.p.stringify(this)},n.prototype.toUint8Array=function(){for(var n=this.t,t=this.i,r=new Uint8Array(t),e=0;e>>2]>>>24-e%4*8&255;return r},n.prototype.concat=function(n){var t=n.words.slice(),r=n.nSigBytes;if(this.clamp(),this.i%4)for(var e=0;e>>2]>>>24-e%4*8&255;this.t[this.i+e>>>2]|=i<<24-(this.i+e)%4*8}else for(e=0;e>>2]=t[e>>>2];return this.i+=r,this},n.prototype.clamp=function(){var n=this.i;this.t[n>>>2]&=4294967295<<32-n%4*8,this.t.length=Math.ceil(n/4)},n.prototype.clone=function(){return new n(this.t.slice(),this.i)},n.random=function(t){for(var r=[],e=0;e"===n?o>t:">="===n?o>=t:o===t))}},5720:function(n,t,r){r.d(t,{p:function(){return i}});var e=r(3354),i={stringify:function(n){for(var t=n.nSigBytes,r=n.words,e=[],i=0;i>>2]>>>24-i%4*8&255;e.push((o>>>4).toString(16)),e.push((15&o).toString(16))}return e.join("")},parse:function(n){var t=n.length;if(t%2!=0)throw new Error("Hex string count must be even");if(!/^[a-fA-F0-9]+$/.test(n))throw new Error("Invalid Hex string: "+n);for(var r=[],i=0;i>>3]|=parseInt(n.substr(i,2),16)<<24-i%8*4;return new e.e(r,t/2)}}},8702:function(n,t,r){r.d(t,{m:function(){return i}});var e=r(3354),i={stringify:function(n){for(var t=n.nSigBytes,r=n.words,e=[],i=0;i>>2]>>>24-i%4*8&255;e.push(String.fromCharCode(o))}return e.join("")},parse:function(n){for(var t=n.length,r=[],i=0;i>>2]|=(255&n.charCodeAt(i))<<24-i%4*8;return new e.e(r,t)}}},4768:function(n,t,r){r.d(t,{d:function(){return i}});var e=r(8702),i={stringify:function(n){try{return decodeURIComponent(escape(e.m.stringify(n)))}catch(n){throw new Error("Malformed UTF-8 data")}},parse:function(n){return e.m.parse(unescape(encodeURIComponent(n)))}}},9054:function(n,t,e){e.d(t,{M:function(){return o}});var i=e(1756),o=function(){if("undefined"!=typeof window){var n=window.crypto||window.msCrypto;if(!n){if((0,i.w)("<",11))return console.warn("IE <= 10 uses insecure random generator. Please consider to use IE11 or another modern browser"),function(){return Math.floor(512*Math.random())%256};throw new Error("Crypto module not found")}return function(){return n.getRandomValues(new Uint32Array(1))[0]}}return void 0!==e.g&&e.g.crypto?function(){return e.g.crypto.randomBytes(4).readInt32LE()}:function(){return r(845).randomBytes(4).readInt32LE()}}()}},t={};function e(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return n[r](o,o.exports,e),o.exports}e.d=function(n,t){for(var r in t)e.o(t,r)&&!e.o(n,r)&&Object.defineProperty(n,r,{enumerable:!0,get:t[r]})},e.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),e.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},e.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"S",{value:!0})};var i={};return function(){e.r(i),e.d(i,{SHA256:function(){return h}});var n,t=e(1868),r=e(3354),o=(n=function(t,r){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,t){n.__proto__=t}||function(n,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r])})(t,r)},function(t,r){function e(){this.constructor=t}n(t,r),t.prototype=null===r?Object.create(r):(e.prototype=r.prototype,new e)}),u=[],f=[];function a(n){for(var t=Math.sqrt(n),r=2;r<=t;r++)if(!(n%r))return!1;return!0}function c(n){return 4294967296*(n-(0|n))|0}!function(){for(var n=2,t=0;t<64;)a(n)&&(t<8&&(u[t]=c(Math.pow(n,.5))),f[t]=c(Math.pow(n,1/3)),t++),n++}();var s=[],h=function(n){function t(t){var e=n.call(this,t)||this;return e.N=new r.e(u.slice(0)),e.v=t,t&&void 0!==t.hash&&(e.N=t.hash.clone()),e}return o(t,n),t.prototype.U=function(){this.N=new r.e(u.slice(0))},t.prototype.I=function(n,t){for(var r=this.N.words,e=r[0],i=r[1],o=r[2],u=r[3],a=r[4],c=r[5],h=r[6],l=r[7],w=0;w<64;w++){if(w<16)s[w]=0|n[t+w];else{var v=s[w-15],d=(v<<25|v>>>7)^(v<<14|v>>>18)^v>>>3,y=s[w-2],p=(y<<15|y>>>17)^(y<<13|y>>>19)^y>>>10;s[w]=d+s[w-7]+p+s[w-16]}var b=e&i^e&o^i&o,m=(e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22),g=l+((a<<26|a>>>6)^(a<<21|a>>>11)^(a<<7|a>>>25))+(a&c^~a&h)+f[w]+s[w];l=h,h=c,c=a,a=u+g|0,u=o,o=i,i=e,e=g+(m+b)|0}r[0]=r[0]+e|0,r[1]=r[1]+i|0,r[2]=r[2]+o|0,r[3]=r[3]+u|0,r[4]=r[4]+a|0,r[5]=r[5]+c|0,r[6]=r[6]+h|0,r[7]=r[7]+l|0},t.prototype._=function(){var n=this.l.words,t=8*this.A,r=8*this.l.nSigBytes;return n[r>>>5]|=128<<24-r%32,n[14+(r+64>>>9<<4)]=Math.floor(t/4294967296),n[15+(r+64>>>9<<4)]=t,this.l.nSigBytes=4*n.length,this.O(),this.N},t.prototype.clone=function(){return new t({hash:this.N,blockSize:this.h,data:this.l,nBytes:this.A})},t.hash=function(n,r){return new t(r).finalize(n)},t}(t.P)}(),i}()},699:function(n,t,r){n.exports=function(){"use strict";var n={d:function(t,r){for(var e in r)n.o(r,e)&&!n.o(t,e)&&Object.defineProperty(t,e,{enumerable:!0,get:r[e]})}};n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),n.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},n.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"t",{value:!0})};var t={};n.r(t),n.d(t,{Utf8:function(){return h}});var e,i=function(n){for(var t=n.nSigBytes,r=n.words,e=[],i=0;i>>2]>>>24-i%4*8&255;e.push((o>>>4).toString(16)),e.push((15&o).toString(16))}return e.join("")},o="undefined"!=typeof navigator&&navigator.userAgent?navigator.userAgent.toLowerCase():"",u=(e=parseInt((/msie (\d+)/.exec(o)||[])[1],10),isNaN(e)?(e=parseInt((/trident\/.*; rv:(\d+)/.exec(o)||[])[1],10),!isNaN(e)&&e):e),f=function(){if("undefined"!=typeof window){var t=window.crypto||window.msCrypto;if(!t){if(function(n,t){return!1!==u&&(!t||("<"===n?u"===n?u>t:">="===n?u>=t:u===t))}("<",11))return console.warn("IE <= 10 uses insecure random generator. Please consider to use IE11 or another modern browser"),function(){return Math.floor(512*Math.random())%256};throw new Error("Crypto module not found")}return function(){return t.getRandomValues(new Uint32Array(1))[0]}}return void 0!==n.g&&n.g.crypto?function(){return n.g.crypto.randomBytes(4).readInt32LE()}:function(){return r(845).randomBytes(4).readInt32LE()}}(),a=function(){function n(t,r){if(Array.isArray(t)||!t)return this.i=Array.isArray(t)?t:[],void(this.u="number"==typeof r?r:4*this.i.length);if(t instanceof n)return this.i=t.words.slice(),void(this.u=t.nSigBytes);var e;try{t instanceof ArrayBuffer?e=new Uint8Array(t):(t instanceof Uint8Array||t instanceof Int8Array||t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)&&(e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength))}catch(n){throw new Error("Invalid argument")}if(!e)throw new Error("Invalid argument");for(var i=e.byteLength,o=[],u=0;u>>2]|=e[u]<<24-u%4*8;this.i=o,this.u=i}return Object.defineProperty(n.prototype,"nSigBytes",{get:function(){return this.u},set:function(n){this.u=n},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"words",{get:function(){return this.i},enumerable:!1,configurable:!0}),n.prototype.toString=function(n){return n?n.stringify(this):i(this)},n.prototype.toUint8Array=function(){for(var n=this.i,t=this.u,r=new Uint8Array(t),e=0;e>>2]>>>24-e%4*8&255;return r},n.prototype.concat=function(n){var t=n.words.slice(),r=n.nSigBytes;if(this.clamp(),this.u%4)for(var e=0;e>>2]>>>24-e%4*8&255;this.i[this.u+e>>>2]|=i<<24-(this.u+e)%4*8}else for(e=0;e>>2]=t[e>>>2];return this.u+=r,this},n.prototype.clamp=function(){var n=this.u;this.i[n>>>2]&=4294967295<<32-n%4*8,this.i.length=Math.ceil(n/4)},n.prototype.clone=function(){return new n(this.i.slice(),this.u)},n.random=function(t){for(var r=[],e=0;e>>2]>>>24-i%4*8&255;e.push(String.fromCharCode(o))}return e.join("")},s=function(n){for(var t=n.length,r=[],e=0;e>>2]|=(255&n.charCodeAt(e))<<24-e%4*8;return new a(r,t)},h={stringify:function(n){try{return decodeURIComponent(escape(c(n)))}catch(n){throw new Error("Malformed UTF-8 data")}},parse:function(n){return s(unescape(encodeURIComponent(n)))}};return t}()},893:function(n,t,r){n.exports=function(){"use strict";var n={d:function(t,r){for(var e in r)n.o(r,e)&&!n.o(t,e)&&Object.defineProperty(t,e,{enumerable:!0,get:r[e]})}};n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),n.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},n.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"t",{value:!0})};var t={};n.r(t),n.d(t,{Word32Array:function(){return a}});var e,i=function(n){for(var t=n.nSigBytes,r=n.words,e=[],i=0;i>>2]>>>24-i%4*8&255;e.push((o>>>4).toString(16)),e.push((15&o).toString(16))}return e.join("")},o="undefined"!=typeof navigator&&navigator.userAgent?navigator.userAgent.toLowerCase():"",u=(e=parseInt((/msie (\d+)/.exec(o)||[])[1],10),isNaN(e)?(e=parseInt((/trident\/.*; rv:(\d+)/.exec(o)||[])[1],10),!isNaN(e)&&e):e),f=function(){if("undefined"!=typeof window){var t=window.crypto||window.msCrypto;if(!t){if(function(n,t){return!1!==u&&(!t||("<"===n?u"===n?u>t:">="===n?u>=t:u===t))}("<",11))return console.warn("IE <= 10 uses insecure random generator. Please consider to use IE11 or another modern browser"),function(){return Math.floor(512*Math.random())%256};throw new Error("Crypto module not found")}return function(){return t.getRandomValues(new Uint32Array(1))[0]}}return void 0!==n.g&&n.g.crypto?function(){return n.g.crypto.randomBytes(4).readInt32LE()}:function(){return r(845).randomBytes(4).readInt32LE()}}(),a=function(){function n(t,r){if(Array.isArray(t)||!t)return this.i=Array.isArray(t)?t:[],void(this.u="number"==typeof r?r:4*this.i.length);if(t instanceof n)return this.i=t.words.slice(),void(this.u=t.nSigBytes);var e;try{t instanceof ArrayBuffer?e=new Uint8Array(t):(t instanceof Uint8Array||t instanceof Int8Array||t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)&&(e=new Uint8Array(t.buffer,t.byteOffset,t.byteLength))}catch(n){throw new Error("Invalid argument")}if(!e)throw new Error("Invalid argument");for(var i=e.byteLength,o=[],u=0;u>>2]|=e[u]<<24-u%4*8;this.i=o,this.u=i}return Object.defineProperty(n.prototype,"nSigBytes",{get:function(){return this.u},set:function(n){this.u=n},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"words",{get:function(){return this.i},enumerable:!1,configurable:!0}),n.prototype.toString=function(n){return n?n.stringify(this):i(this)},n.prototype.toUint8Array=function(){for(var n=this.i,t=this.u,r=new Uint8Array(t),e=0;e>>2]>>>24-e%4*8&255;return r},n.prototype.concat=function(n){var t=n.words.slice(),r=n.nSigBytes;if(this.clamp(),this.u%4)for(var e=0;e>>2]>>>24-e%4*8&255;this.i[this.u+e>>>2]|=i<<24-(this.u+e)%4*8}else for(e=0;e>>2]=t[e>>>2];return this.u+=r,this},n.prototype.clamp=function(){var n=this.u;this.i[n>>>2]&=4294967295<<32-n%4*8,this.i.length=Math.ceil(n/4)},n.prototype.clone=function(){return new n(this.i.slice(),this.u)},n.random=function(t){for(var r=[],e=0;e0)throw new Error(`can't cast ${JSON.stringify(n)} to bytes`);return o.Bytes.NULL}if("function"==typeof n.serialize)return o.Bytes.from(n,"G1Element");throw new Error(`can't cast ${JSON.stringify(n)} to bytes`)}function l(n){let t=n;const r=[t],u=[o.t(0,e.None)];for(;u.length;){const n=u.pop(),f=n[0];let a=n[1];if(0!==f){if(null===a)throw new Error("Invalid target. target is null");1===f?r[a].pair=o.t(new i.CLVMObject(r.pop()),r[a].pair[1]):2===f?r[a].pair=o.t(r[a].pair[0],new i.CLVMObject(r.pop())):3===f&&(r[a]=new i.CLVMObject(o.t(r.pop(),r[a])))}else{if(s(r[r.length-1]))continue;if(t=r.pop(),o.isTuple(t)){if(2!==t.length)throw new Error(`can't cast tuple of size ${t.length}`);const[n,f]=t;a=r.length,r.push(new i.CLVMObject(o.t(n,f))),s(f)||(r.push(f),u.push(o.t(2,a)),u.push(o.t(0,e.None))),s(n)||(r.push(n),u.push(o.t(1,a)),u.push(o.t(0,e.None)));continue}if(Array.isArray(t)){a=r.length,r.push(new i.CLVMObject(o.Bytes.NULL));for(const n of t)r.push(n),u.push(o.t(3,a)),s(n)||u.push(o.t(0,e.None));continue}r.push(new i.CLVMObject(h(t)))}}if(1!==r.length)throw new Error("internal error");return r[0]}t.looks_like_clvm_object=s,t.convert_atom_to_bytes=h,t.to_sexp_type=l;class w{constructor(n){this.atom=e.None,this.pair=e.None,this.atom=n.atom,this.pair=n.pair}static to(n){return v(n)?n:s(n)?new w(n):new w(l(n))}static null(){return w.an}as_pair(){const n=this.pair;return n===e.None?n:o.t(new w(n[0]),new w(n[1]))}listp(){return this.pair!==e.None}nullp(){return this.atom!==e.None&&0===this.atom.raw().length}as_int(){return u.int_from_bytes(this.atom)}as_bin(){const n=new o.Stream;return f.sexp_to_stream(this,n),n.getValue()}cons(n){return w.to(o.t(this,n))}first(){const n=this.pair;if(n)return new w(n[0]);throw new c.EvalError("first of non-cons",this)}rest(){const n=this.pair;if(n)return new w(n[1]);throw new c.EvalError("rest of non-cons",this)}*as_iter(){let n=this;for(;!n.nullp();)yield n.first(),n=n.rest()}equal_to(n){try{n=w.to(n);const t=[o.t(this,n)];for(;t.length;){const[n,r]=t.pop(),e=n.as_pair();if(e){const n=r.as_pair();if(!n)return!1;t.push(o.t(e[0],n[0])),t.push(o.t(e[1],n[1]))}else if(r.as_pair()||!(n.atom&&r.atom&&n.atom.equal_to(r.atom)))return!1}return!0}catch(n){return!1}}list_len(){let n=this,t=0;for(;n.listp();)t+=1,n=n.rest();return t}as_javascript(){return a.as_javascript(this)}toString(){return this.as_bin().hex()}cn(){return`SExp(${this.as_bin().hex()})`}}function v(n){return n&&void 0!==n.atom&&void 0!==n.pair&&"function"==typeof n.first&&"function"==typeof n.rest&&"function"==typeof n.cons}t.SExp=w,w.TRUE=new w(new i.CLVMObject(o.Bytes.from("0x01","hex"))),w.FALSE=new w(new i.CLVMObject(o.Bytes.NULL)),w.an=new w(new i.CLVMObject(o.Bytes.NULL)),t.isSExp=v},190:function(n,t,r){"use strict";var e=this&&this.sn||function(n,t,r,e){return new(r||(r=Promise))((function(i,o){function u(n){try{a(e.next(n))}catch(n){o(n)}}function f(n){try{a(e.throw(n))}catch(n){o(n)}}function a(n){var t;n.done?i(n.value):(t=n.value,t instanceof r?t:new r((function(n){n(t)}))).then(u,f)}a((e=e.apply(n,t||[])).next())}))};Object.defineProperty(t,"un",{value:!0}),t.G1Element_add=t.assert_G1Element_valid=t.G1Element_from_bytes=t.getBLSModule=t.initializeBLS=t.loadPromise=t.BLS=void 0;const i=r(513);function o(){if(!t.BLS)throw new Error("BLS module has not been loaded. Please call `await initializeBLS()` on start up");return t.BLS}function u(n){const t=o(),{G1Element:r}=t;if(n.length!==r.SIZE)throw new Error("G1Element: Invalid size");if(192==(192&n[0])){if(192!==n[0])throw new Error("G1Element: Given G1 infinity element must be canonical");for(let t=1;t{if(t.BLS)return t.loadPromise=void 0,n(t.BLS);i().then((e=>e?(t.loadPromise=void 0,n(t.BLS=e)):r())).catch((n=>(console.error("Error while loading BLS module"),r(n))))}))}))},t.getBLSModule=o,t.G1Element_from_bytes=function(n){u(n);const t=o();try{return t.G1Element.from_bytes(n)}catch(n){throw new Error("Exception in G1Element operation")}},t.assert_G1Element_valid=u,t.G1Element_add=function(n,t){try{return n.add(t)}catch(n){throw new Error("Exception in G1Element operation")}}},572:function(n,t,r){"use strict";Object.defineProperty(t,"un",{value:!0}),t.prettyPrint=void 0;const e=r(907);t.prettyPrint=function(n){if(n){const n=e.SExp.prototype.toString;e.SExp.prototype.toString=e.SExp.prototype.cn,e.SExp.prototype.cn=n}else{const n=e.SExp.prototype.toString;e.SExp.prototype.toString=e.SExp.prototype.cn,e.SExp.prototype.cn=n}}},213:function(n,t){"use strict";Object.defineProperty(t,"un",{value:!0}),t.None=void 0,t.None=null},593:function(n,t,r){"use strict";Object.defineProperty(t,"un",{value:!0}),t.Stream=t.isBytes=t.isIterable=t.isList=t.isTuple=t.t=t.Tuple=t.list=t.h=t.b=t.Bytes=t.PyBytes_Repr=t.to_hexstr=void 0;const e=r(502),i=r(699),o=r(893),u=r(915),f=r(213);function a(n){return new o.Word32Array(n).toString()}function c(n){let t=0,r=0;for(let e=0;e=127?(i+="\\x",i+=r.toString(16).padStart(2,"0")):i+=o}return i+=e,i}t.to_hexstr=a,t.PyBytes_Repr=c;class s{constructor(n){if(n instanceof Uint8Array)this.hn=n;else if(w(n))this.hn=n.raw();else{if(n&&n!==f.None)throw new Error(`Invalid value: ${JSON.stringify(n)}`);this.hn=new Uint8Array}}static from(n,t){if(n===f.None||void 0===n)return new s(n);if(n instanceof Uint8Array)return new s(n.slice());if(w(n))return new s(n.data());if(Array.isArray(n)&&n.every((n=>"number"==typeof n))){if(n.some((n=>n<0||n>255)))throw new Error("Bytes must be in range [0, 256)");return new s(Uint8Array.from(n))}if("string"==typeof n)return"hex"===t?(n=n.replace(/^0x/,""),new s(e.Hex.parse(n).toUint8Array())):new s(i.Utf8.parse(n).toUint8Array());if("G1Element"===t){if("function"!=typeof n.serialize)throw new Error("Invalid G1Element");const t=n.serialize();return new s(t)}throw new Error(`Invalid value: ${JSON.stringify(n)}`)}static SHA256(n){let t;if("string"==typeof n)t=u.SHA256.hash(n);else if(n instanceof Uint8Array)t=new o.Word32Array(n),t=u.SHA256.hash(t);else{if(!w(n))throw new Error("Invalid argument");t=n.as_word(),t=u.SHA256.hash(t)}return new s(t.toUint8Array())}get length(){return this.hn.length}get_byte_at(n){return 0|this.hn[n]}concat(n){const t=this.hn,r=n.raw(),e=new Uint8Array(t.length+r.length);return e.set(t,0),e.set(r,t.length),new s(e)}repeat(n){const t=new Uint8Array(this.length*n);for(let r=0;rn.length?1:-1;const t=new DataView(this.raw().buffer),r=new DataView(n.raw().buffer),e=this.length/4|0;for(let n=0;ni?1:-1}for(let n=4*e;ni?1:-1}return 0}}t.Bytes=s,s.NULL=new s,t.b=function(n,t="utf8"){return s.from(n,t)},t.h=function(n){return s.from(n,"hex")},t.list=function(n){const t=[];for(const r of n)t.push(r);return t};class h extends Array{constructor(...n){return super(...n),Object.freeze(this),this}toString(){return`(${this[0]}, ${this[1]})`}}function l(n){return n instanceof Array&&Object.isFrozen(n)&&2===n.length}function w(n){return n&&"number"==typeof n.length&&"function"==typeof n.get_byte_at&&"function"==typeof n.raw&&"function"==typeof n.data&&"function"==typeof n.hex&&"function"==typeof n.decode&&"function"==typeof n.equal_to&&"function"==typeof n.compare}t.Tuple=h,t.t=function(n,t){return new h(n,t)},t.isTuple=l,t.isList=function(n){return Array.isArray(n)&&!l(n)},t.isIterable=function(n){return!!Array.isArray(n)||"string"!=typeof n&&"function"==typeof n[Symbol.iterator]},t.isBytes=w;class v{constructor(n){this.ln=4,this.wn=0,n?(n.length>v.INITIAL_BUFFER_SIZE?this.vn=new Uint8Array(2*n.length):this.vn=new Uint8Array(v.INITIAL_BUFFER_SIZE),this.vn.set(n.raw()),this.dn=n.length):(this.vn=new Uint8Array(v.INITIAL_BUFFER_SIZE),this.dn=0)}get seek(){return this.wn}set seek(n){n<0?this.wn=this.length-1:n>this.length-1?this.wn=this.length:this.wn=n}get length(){return this.dn}reAllocate(n){let t="number"==typeof n?n:this.vn.length*this.ln;t>4294967295&&(t=4294967295);const r=new Uint8Array(t);r.set(this.vn),this.vn=r}write(n){const t=Math.max(this.length,n.length+this.wn);t>this.vn.length&&this.reAllocate(t*this.ln);const r=this.seek;return this.vn.set(n.raw(),r),this.dn=t,this.seek+=n.length,n.length}read(n){if(this.seek>this.length-1)return new s;if(this.seek+n<=this.length){const t=this.vn.slice(this.seek,this.seek+n);return this.seek+=n,new s(t)}const t=new Uint8Array(this.length-this.seek);return t.set(this.vn.subarray(this.seek,this.length)),this.seek+=n,new s(t)}getValue(){return new s(this.vn.subarray(0,this.length))}}t.Stream=v,v.INITIAL_BUFFER_SIZE=65536},19:function(n,t,r){"use strict";Object.defineProperty(t,"un",{value:!0}),t.as_javascript=void 0;const e=r(593);t.as_javascript=function(n){function t(n,t){const r=t.pop(),e=t.pop();t.push(r),t.push(e)}function r(n,t){const r=t.pop(),i=t.pop();i.equal_to(e.Bytes.NULL)?t.push([r]):t.push(e.t(r,i))}function i(n,t){let r=[t.pop()];const e=t.pop();r=r.concat(e),t.push(r)}const o=[function n(e,o){const u=o.pop(),f=u.as_pair();if(f){const[u,a]=f;a.listp()?e.push(i):e.push(r),e.push(n),e.push(t),e.push(n),o.push(u),o.push(a)}else o.push(u.atom)}],u=[n];for(;o.length;){const n=o.pop();n&&n(o,u)}return u[u.length-1]}},959:function(n,t,r){"use strict";Object.defineProperty(t,"un",{value:!0}),t.limbs_for_int=t.int_to_bytes=t.int_from_bytes=void 0;const e=r(593);t.int_from_bytes=function(n){if(!n||0===n.length)return 0;const t=parseInt(n.hex(),16);return 128&n.get_byte_at(0)?t-(1<<8*n.length):t},t.int_to_bytes=function(n){if(n>Number.MAX_SAFE_INTEGER||n0?"MAX_SAFE_INTEGER":"MIN_SAFE_INTEGER"}: ${n}`);if(0===n)return e.Bytes.NULL;const t=(n<0?-n:n).toString(2).length+8>>3;let r=(n>>>0).toString(16);for(n>=0&&(r=r.length%2?`0${r}`:r);r.length/22&&r.substr(0,2)===(128&parseInt(r.substr(2,2),16)?"ff":"00");)r=r.substr(2);return e.h(r)},t.limbs_for_int=function(n){return(n<0?-n:n).toString(2).length+7>>3}},143:function(n,t,r){"use strict";Object.defineProperty(t,"un",{value:!0}),t.op_eq=t.op_raise=t.op_listp=t.op_rest=t.op_first=t.op_cons=t.op_if=void 0;const e=r(907),i=r(593),o=r(449),u=r(755);t.op_if=function(n){if(3!==n.list_len())throw new u.EvalError("i takes exactly 3 arguments",n);const t=n.rest();return n.first().nullp()?i.t(o.IF_COST,t.rest().first()):i.t(o.IF_COST,t.first())},t.op_cons=function(n){if(2!==n.list_len())throw new u.EvalError("c takes exactly 2 arguments",n);return i.t(o.CONS_COST,n.first().cons(n.rest().first()))},t.op_first=function(n){if(1!==n.list_len())throw new u.EvalError("f takes exactly 1 argument",n);return i.t(o.FIRST_COST,n.first().first())},t.op_rest=function(n){if(1!==n.list_len())throw new u.EvalError("r takes exactly 1 argument",n);return i.t(o.REST_COST,n.first().rest())},t.op_listp=function(n){if(1!==n.list_len())throw new u.EvalError("l takes exactly 1 argument",n);return i.t(o.LISTP_COST,n.first().listp()?e.SExp.TRUE:e.SExp.FALSE)},t.op_raise=function(n){throw new u.EvalError("clvm raise",n)},t.op_eq=function(n){if(2!==n.list_len())throw new u.EvalError("= takes exactly 2 arguments",n);const t=n.first(),r=n.rest().first();if(t.pair||r.pair)throw new u.EvalError("= on list",t.pair?t:r);const f=t.atom,a=r.atom;let c=o.EQ_BASE_COST;return c+=(f.length+a.length)*o.EQ_COST_PER_BYTE,i.t(c,f.equal_to(a)?e.SExp.TRUE:e.SExp.FALSE)}},449:function(n,t){"use strict";Object.defineProperty(t,"un",{value:!0}),t.APPLY_COST=t.LOGNOT_COST_PER_BYTE=t.LOGNOT_BASE_COST=t.LSHIFT_COST_PER_BYTE=t.LSHIFT_BASE_COST=t.ASHIFT_COST_PER_BYTE=t.ASHIFT_BASE_COST=t.BOOL_COST_PER_ARG=t.BOOL_BASE_COST=t.CONCAT_COST_PER_BYTE=t.CONCAT_COST_PER_ARG=t.CONCAT_BASE_COST=t.PATH_LOOKUP_COST_PER_ZERO_BYTE=t.PATH_LOOKUP_COST_PER_LEG=t.PATH_LOOKUP_BASE_COST=t.STRLEN_COST_PER_BYTE=t.STRLEN_BASE_COST=t.MUL_SQUARE_COST_PER_BYTE_DIVIDER=t.MUL_LINEAR_COST_PER_BYTE=t.MUL_COST_PER_OP=t.MUL_BASE_COST=t.PUBKEY_COST_PER_BYTE=t.PUBKEY_BASE_COST=t.POINT_ADD_COST_PER_ARG=t.POINT_ADD_BASE_COST=t.SHA256_COST_PER_BYTE=t.SHA256_COST_PER_ARG=t.SHA256_BASE_COST=t.DIV_COST_PER_BYTE=t.DIV_BASE_COST=t.DIVMOD_COST_PER_BYTE=t.DIVMOD_BASE_COST=t.GR_COST_PER_BYTE=t.GR_BASE_COST=t.EQ_COST_PER_BYTE=t.EQ_BASE_COST=t.GRS_COST_PER_BYTE=t.GRS_BASE_COST=t.LOG_COST_PER_ARG=t.LOG_COST_PER_BYTE=t.LOG_BASE_COST=t.ARITH_COST_PER_ARG=t.ARITH_COST_PER_BYTE=t.ARITH_BASE_COST=t.MALLOC_COST_PER_BYTE=t.LISTP_COST=t.REST_COST=t.FIRST_COST=t.CONS_COST=t.IF_COST=void 0,t.QUOTE_COST=void 0,t.IF_COST=33,t.CONS_COST=50,t.FIRST_COST=30,t.REST_COST=30,t.LISTP_COST=19,t.MALLOC_COST_PER_BYTE=10,t.ARITH_BASE_COST=99,t.ARITH_COST_PER_BYTE=3,t.ARITH_COST_PER_ARG=320,t.LOG_BASE_COST=100,t.LOG_COST_PER_BYTE=3,t.LOG_COST_PER_ARG=264,t.GRS_BASE_COST=117,t.GRS_COST_PER_BYTE=1,t.EQ_BASE_COST=117,t.EQ_COST_PER_BYTE=1,t.GR_BASE_COST=498,t.GR_COST_PER_BYTE=2,t.DIVMOD_BASE_COST=1116,t.DIVMOD_COST_PER_BYTE=6,t.DIV_BASE_COST=988,t.DIV_COST_PER_BYTE=4,t.SHA256_BASE_COST=87,t.SHA256_COST_PER_ARG=134,t.SHA256_COST_PER_BYTE=2,t.POINT_ADD_BASE_COST=101094,t.POINT_ADD_COST_PER_ARG=1343980,t.PUBKEY_BASE_COST=1325730,t.PUBKEY_COST_PER_BYTE=38,t.MUL_BASE_COST=92,t.MUL_COST_PER_OP=885,t.MUL_LINEAR_COST_PER_BYTE=6,t.MUL_SQUARE_COST_PER_BYTE_DIVIDER=128,t.STRLEN_BASE_COST=173,t.STRLEN_COST_PER_BYTE=1,t.PATH_LOOKUP_BASE_COST=40,t.PATH_LOOKUP_COST_PER_LEG=4,t.PATH_LOOKUP_COST_PER_ZERO_BYTE=4,t.CONCAT_BASE_COST=142,t.CONCAT_COST_PER_ARG=135,t.CONCAT_COST_PER_BYTE=3,t.BOOL_BASE_COST=200,t.BOOL_COST_PER_ARG=300,t.ASHIFT_BASE_COST=596,t.ASHIFT_COST_PER_BYTE=3,t.LSHIFT_BASE_COST=277,t.LSHIFT_COST_PER_BYTE=3,t.LOGNOT_BASE_COST=331,t.LOGNOT_COST_PER_BYTE=3,t.APPLY_COST=90,t.QUOTE_COST=20},465:function(n,t,r){"use strict";var e=this&&this.yn||(Object.create?function(n,t,r,e){void 0===e&&(e=r),Object.defineProperty(n,e,{enumerable:!0,get:function(){return t[r]}})}:function(n,t,r,e){void 0===e&&(e=r),n[e]=t[r]}),i=this&&this.pn||function(n,t){for(var r in n)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||e(t,n,r)};Object.defineProperty(t,"un",{value:!0}),t.to_sexp_f=void 0;const o=r(907);i(r(572),t),i(r(190),t),i(r(213),t),i(r(593),t),i(r(19),t),i(r(959),t),i(r(629),t),i(r(143),t),i(r(449),t),i(r(755),t),i(r(419),t),i(r(601),t),i(r(637),t),i(r(990),t),i(r(282),t),i(r(351),t),i(r(907),t),t.to_sexp_f=o.SExp.to},419:function(n,t,r){"use strict";var e=this&&this.sn||function(n,t,r,e){return new(r||(r=Promise))((function(i,o){function u(n){try{a(e.next(n))}catch(n){o(n)}}function f(n){try{a(e.throw(n))}catch(n){o(n)}}function a(n){var t;n.done?i(n.value):(t=n.value,t instanceof r?t:new r((function(n){n(t)}))).then(u,f)}a((e=e.apply(n,t||[])).next())}))};Object.defineProperty(t,"un",{value:!0}),t.initialize=void 0;const i=r(190);t.initialize=function(){return e(this,void 0,void 0,(function*(){yield i.initializeBLS()}))}},601:function(n,t,r){"use strict";Object.defineProperty(t,"un",{value:!0}),t.op_softfork=t.op_all=t.op_any=t.op_not=t.op_lognot=t.op_logxor=t.op_logior=t.op_logand=t.binop_reduction=t.op_lsh=t.op_ash=t.op_concat=t.op_substr=t.op_strlen=t.op_pubkey_for_exp=t.op_gr_bytes=t.op_gr=t.op_div=t.op_divmod=t.op_multiply=t.op_subtract=t.op_add=t.args_as_bool_list=t.args_as_bools=t.args_as_int_list=t.args_as_int32=t.args_as_ints=t.op_sha256=t.malloc_cost=void 0;const e=r(915),i=r(907),o=r(449),u=r(593),f=r(755),a=r(959),c=r(629),s=r(190);function h(n,t){if(!t.atom)throw new f.EvalError("atom is None",t);return u.t(n+t.atom.length*o.MALLOC_COST_PER_BYTE,t)}function*l(n,t){for(const r of t.as_iter()){if(r.pair||!r.atom)throw new f.EvalError(`${n} requires int args`,r);yield u.t(r.as_int(),r.atom.length)}}function*w(n,t){for(const r of t.as_iter()){if(r.pair||!r.atom)throw new f.EvalError(`${n} requires int32 args`,r);if(r.atom.length>4)throw new f.EvalError(`${n} requires int32 args (with no leading zeros`,r);yield r.as_int()}}function v(n,t,r){const e=[];for(const r of l(n,t))e.push(r);if(e.length!==r){const e=1!==r?"s":"";throw new f.EvalError(`${n} takes exactly ${r} argument${e}`,t)}return e}function*d(n,t){for(const n of t.as_iter()){const t=n.atom;(null==t?void 0:t.equal_to(u.Bytes.NULL))?yield i.SExp.FALSE:yield i.SExp.TRUE}}function y(n,t,r){const e=[];for(const n of d(0,t))e.push(n);if(e.length!==r){const e=1!==r?"s":"";throw new f.EvalError(`${n} takes exactly ${r} argument${e}`,t)}return e}function p(n,t,r,e){let u=t,f=0,a=o.LOG_BASE_COST;for(const t of l(n,r)){const[n,r]=t;u=e(u,n),f+=r,a+=o.LOG_COST_PER_ARG}return a+=f*o.LOG_COST_PER_BYTE,h(a,i.SExp.to(u))}t.malloc_cost=h,t.op_sha256=function(n){let t=o.SHA256_BASE_COST,r=0;const a=new e.SHA256;for(const e of n.as_iter()){const n=e.atom;if(!n)throw new f.EvalError("sha256 on list",e);r+=n.length,t+=o.SHA256_COST_PER_ARG,a.update(n.as_word())}return t+=r*o.SHA256_COST_PER_BYTE,h(t,i.SExp.to(u.Bytes.from(a.finalize().toUint8Array())))},t.args_as_ints=l,t.args_as_int32=w,t.args_as_int_list=v,t.args_as_bools=d,t.args_as_bool_list=y,t.op_add=function(n){let t=0,r=o.ARITH_BASE_COST,e=0;for(const i of l("+",n)){const[n,u]=i;t+=n,e+=u,r+=o.ARITH_COST_PER_ARG}return r+=e*o.ARITH_COST_PER_BYTE,h(r,i.SExp.to(t))},t.op_subtract=function(n){let t=o.ARITH_BASE_COST;if(n.nullp())return h(t,i.SExp.to(0));let r=1,e=0,u=0;for(const i of l("-",n)){const[n,f]=i;e+=r*n,r=-1,u+=f,t+=o.ARITH_COST_PER_BYTE}return t+=u*o.ARITH_COST_PER_BYTE,h(t,i.SExp.to(e))},t.op_multiply=function(n){let t=o.MUL_BASE_COST;const r=l("*",n),e=r.next();if(e.done)return h(t,i.SExp.to(1));let[u,f]=e.value;for(const n of r){const[r,e]=n;t+=o.MUL_COST_PER_OP,t+=(e+f)*o.MUL_LINEAR_COST_PER_BYTE,t+=e*f/o.MUL_SQUARE_COST_PER_BYTE_DIVIDER>>0,u*=r,f=a.limbs_for_int(u)}return h(t,i.SExp.to(u))},t.op_divmod=function(n){let t=o.DIVMOD_BASE_COST;const[r,e]=v("divmod",n,2),[a,c]=r,[s,h]=e;if(0===s)throw new f.EvalError("divmod with 0",i.SExp.to(a));t+=(c+h)*o.DIVMOD_COST_PER_BYTE;const l=a/s>>0,w=a%s,d=i.SExp.to(l),y=i.SExp.to(w);return t+=(d.atom.length+y.atom.length)*o.MALLOC_COST_PER_BYTE,u.t(t,i.SExp.to(u.t(l,w)))},t.op_div=function(n){let t=o.DIV_BASE_COST;const[r,e]=v("/",n,2),[u,a]=r,[c,s]=e;if(0===c)throw new f.EvalError("div with 0",i.SExp.to(u));t+=(a+s)*o.DIV_COST_PER_BYTE;const l=u/c>>0;return h(t,i.SExp.to(l))},t.op_gr=function(n){const[t,r]=v(">",n,2),[e,f]=t,[a,c]=r;let s=o.GR_BASE_COST;return s+=(f+c)*o.GR_COST_PER_BYTE,u.t(s,e>a?i.SExp.TRUE:i.SExp.FALSE)},t.op_gr_bytes=function(n){const t=[];for(const r of n.as_iter())t.push(r);if(2!==t.length)throw new f.EvalError(">s takes exactly 2 arguments",n);const[r,e]=t;if(r.pair||e.pair)throw new f.EvalError(">s on list",r.pair?r:e);const a=r.atom,c=e.atom;let s=o.GRS_BASE_COST;return s+=(a.length+c.length)*o.GRS_COST_PER_BYTE,u.t(s,a.compare(c)>0?i.SExp.TRUE:i.SExp.FALSE)},t.op_pubkey_for_exp=function(n){let t=o.POINT_ADD_BASE_COST;const{G1Element:r}=s.getBLSModule();let e=new r;for(const r of n.as_iter()){if(!c.isAtom(r))throw new f.EvalError("point_add on list",r);try{const n=s.G1Element_from_bytes(r.atom.data());e=s.G1Element_add(e,n),t+=o.POINT_ADD_COST_PER_ARG}catch(t){throw new f.EvalError(`point_add expects blob, got ${r.atom}: ${JSON.stringify(t)}`,n)}}return h(t,i.SExp.to(e))},t.op_strlen=function(n){if(1!==n.list_len())throw new f.EvalError("strlen takes exactly 1 argument",n);const t=n.first();if(!c.isAtom(t))throw new f.EvalError("strlen on list",t);const r=t.atom.length;return h(o.STRLEN_BASE_COST+r*o.STRLEN_COST_PER_BYTE,i.SExp.to(r))},t.op_substr=function(n){const t=n.list_len();if(![2,3].includes(t))throw new f.EvalError("substr takes exactly 2 or 3 arguments",n);const r=n.first();if(!c.isAtom(r))throw new f.EvalError("substr on list",r);const e=r.atom;let o,a;if(2===t)o=w("substr",n.rest()).next().value,a=e.length;else{const t=[];for(const r of w("substr",n.rest()))t.push(r);[o,a]=t}if(a>e.length||a4)throw new f.EvalError("ash requires int32 args (with no leading zeros)",n.rest().first());if(Math.abs(c)>65535)throw new f.EvalError("shift too large",i.SExp.to(c));let l;l=c>=0?e<>-c;let w=o.ASHIFT_BASE_COST;return w+=(u+a.limbs_for_int(l))*o.ASHIFT_COST_PER_BYTE,h(w,i.SExp.to(l))},t.op_lsh=function(n){const[t,r]=v("lsh",n,2),e=t[1],[u,c]=r;if(c>4)throw new f.EvalError("lsh requires int32 args (with no leading zeros)",n.rest().first());if(Math.abs(u)>65535)throw new f.EvalError("shift too large",i.SExp.to(u));const s=n.first().atom,l=a.int_from_bytes(s);let w;w=u>=0?l<>-u;let d=o.LSHIFT_BASE_COST;return d+=(e+a.limbs_for_int(w))*o.LSHIFT_COST_PER_BYTE,h(d,i.SExp.to(w))},t.binop_reduction=p,t.op_logand=function(n){return p("logand",-1,n,((n,t)=>n&=t))},t.op_logior=function(n){return p("logior",0,n,((n,t)=>n|=t))},t.op_logxor=function(n){return p("logxor",0,n,((n,t)=>n^=t))},t.op_lognot=function(n){const t=v("lognot",n,1),[r,e]=t[0];return h(o.LOGNOT_BASE_COST+e*o.LOGNOT_COST_PER_BYTE,i.SExp.to(~r))},t.op_not=function(n){const t=y("not",n,1)[0];if(!c.isAtom(t))throw new f.EvalError("not on list",n);let r;return r=t.atom.equal_to(u.Bytes.NULL)?i.SExp.TRUE:i.SExp.FALSE,u.t(o.BOOL_BASE_COST,i.SExp.to(r))},t.op_any=function(n){const t=[];for(const r of d(0,n))t.push(r);const r=o.BOOL_BASE_COST+t.length*o.BOOL_COST_PER_ARG;let e=i.SExp.FALSE;for(const r of t){if(!c.isAtom(r))throw new f.EvalError("any on list",n);if(!r.atom.equal_to(u.Bytes.NULL)){e=i.SExp.TRUE;break}}return u.t(r,i.SExp.to(e))},t.op_all=function(n){const t=[];for(const r of d(0,n))t.push(r);const r=o.BOOL_BASE_COST+t.length*o.BOOL_COST_PER_ARG;let e=i.SExp.TRUE;for(const r of t){if(!c.isAtom(r))throw new f.EvalError("all on list",n);if(r.atom.equal_to(u.Bytes.NULL)){e=i.SExp.FALSE;break}}return u.t(r,i.SExp.to(e))},t.op_softfork=function(n){if(n.list_len()<1)throw new f.EvalError("softfork takes at least 1 argument",n);const t=n.first();if(!c.isAtom(t))throw new f.EvalError("softfork requires int args",t);const r=t.as_int();if(r<1)throw new f.EvalError("cost must be > 0",n);return u.t(r,i.SExp.FALSE)}},637:function(n,t){"use strict";function r(n,t,r){const e={};for(const i of Object.keys(n)){const o=t[`op_${r[i]||i}`];"function"==typeof o&&(e[n[i]]=o)}return e}Object.defineProperty(t,"un",{value:!0}),t.operators_for_module=t.operators_for_dict=void 0,t.operators_for_dict=r,t.operators_for_module=function(n,t,e={}){return r(n,t,e)}},990:function(n,t,r){"use strict";Object.defineProperty(t,"un",{value:!0}),t.OPERATOR_LOOKUP=t.OperatorDict=t.APPLY_ATOM=t.QUOTE_ATOM=t.default_unknown_op=t.args_len=t.OP_REWRITE=t.KEYWORD_TO_ATOM=t.KEYWORD_FROM_ATOM=void 0;const e=r(959),i=r(907),o=r(593),u=r(755),f=r(449),a=r(637),c=r(143),s=r(601);function*h(n,t){for(const r of t.as_iter()){if(r.pair)throw new u.EvalError(`${n} requires int args"`,r);yield r.atom.length}}function l(n,t){if(0===n.length||n.slice(0,2).equal_to(o.Bytes.from("0xffff","hex")))throw new u.EvalError("reserved operator",i.SExp.to(n));const r=(192&n.get_byte_at(n.length-1))>>6;if(n.length>5)throw new u.EvalError("invalid operator",i.SExp.to(n));const a=e.int_from_bytes(n.slice(0,n.length-1))+1;let c;if(0===r)c=1;else if(1===r){c=f.ARITH_BASE_COST;let n=0;for(const r of h("unknown op",t))n+=r,c+=f.ARITH_COST_PER_ARG;c+=n*f.ARITH_COST_PER_BYTE}else if(2===r){c=f.MUL_BASE_COST;const n=h("unknown op",t),r=n.next();if(!r.done){let t=r.value;for(const r of n)c+=f.MUL_COST_PER_OP,c+=(r+t)*f.MUL_LINEAR_COST_PER_BYTE,c+=r*t/f.MUL_SQUARE_COST_PER_BYTE_DIVIDER>>0,t+=r}}else{if(3!==r)throw new Error(`Invalid cost_function: ${r}`);{c=f.CONCAT_BASE_COST;let n=0;for(const r of t.as_iter()){if(r.pair)throw new u.EvalError("unknown op on list",r);c+=f.CONCAT_COST_PER_ARG,n+=r.atom.length}c+=n*f.CONCAT_COST_PER_BYTE}}if(c*=a,c>=2**32)throw new u.EvalError("invalid operator",i.SExp.to(n));return o.t(c,i.SExp.null())}function w(n,t){Object.keys(t).forEach((r=>{n[r]=t[r]}))}function v(n,t={}){const r=Object.assign(Object.assign({},n),{quote_atom:t.quote_atom||n.quote_atom,apply_atom:t.apply_atom||n.apply_atom,unknown_op_handler:t.unknown_op_handler||l});if(!r.quote_atom)throw new Error("object has not attribute 'quote_atom'");if(!r.apply_atom)throw new Error("object has not attribute 'apply_atom'");const e=function(n,t){if("string"==typeof n)n=o.Bytes.from(n,"hex");else if("number"==typeof n)n=o.Bytes.from([n]);else if(!o.isBytes(n))throw new Error(`Invalid op: ${JSON.stringify(n)}`);w(r,e);const i=r[n.hex()];return"function"!=typeof i?r.unknown_op_handler(n,t):i(t)};return w(e,r),e}t.KEYWORD_FROM_ATOM={"00":".","01":"q","02":"a","03":"i","04":"c","05":"f","06":"r","07":"l","08":"x","09":"=","0a":">s","0b":"sha256","0c":"substr","0d":"strlen","0e":"concat","0f":".",10:"+",11:"-",12:"*",13:"/",14:"divmod",15:">",16:"ash",17:"lsh",18:"logand",19:"logior","1a":"logxor","1b":"lognot","1c":".","1d":"point_add","1e":"pubkey_for_exp","1f":".",20:"not",21:"any",22:"all",23:".",24:"softfork"},t.KEYWORD_TO_ATOM={q:"01",a:"02",i:"03",c:"04",f:"05",r:"06",l:"07",x:"08","=":"09",">s":"0a",sha256:"0b",substr:"0c",strlen:"0d",concat:"0e","+":"10","-":"11","*":"12","/":"13",divmod:"14",">":"15",ash:"16",lsh:"17",logand:"18",logior:"19",logxor:"1a",lognot:"1b",point_add:"1d",pubkey_for_exp:"1e",not:"20",any:"21",all:"22",".":"23",softfork:"24"},t.OP_REWRITE={"+":"add","-":"subtract","*":"multiply","/":"div",i:"if",c:"cons",f:"first",r:"rest",l:"listp",x:"raise","=":"eq",">":"gr",">s":"gr_bytes"},t.args_len=h,t.default_unknown_op=l,t.QUOTE_ATOM=o.Bytes.from(t.KEYWORD_TO_ATOM.q,"hex"),t.APPLY_ATOM=o.Bytes.from(t.KEYWORD_TO_ATOM.a,"hex"),t.OperatorDict=v;const d=v(a.operators_for_module(t.KEYWORD_TO_ATOM,c,t.OP_REWRITE),{quote_atom:t.QUOTE_ATOM,apply_atom:t.APPLY_ATOM});w(d,a.operators_for_module(t.KEYWORD_TO_ATOM,s,t.OP_REWRITE)),t.OPERATOR_LOOKUP=d},282:function(n,t,r){"use strict";Object.defineProperty(t,"un",{value:!0}),t.run_program=t.msb_mask=t.to_pre_eval_op=void 0;const e=r(213),i=r(907),o=r(629),u=r(593),f=r(449),a=r(755);function c(n,t){return function(r,e){const i=t(e[e.length-1]),o=n(i.first(),i.rest());if("function"==typeof o){const n=(n,r)=>(o(t(r[r.length-1])),0);r.push(n)}}}function s(n){return n|=n>>1,n|=n>>2,1+(n|=n>>4)>>1}t.to_pre_eval_op=c,t.msb_mask=s,t.run_program=function(n,t,r,h=e.None,l=e.None){n=i.SExp.to(n);const w=l?c(l,i.SExp.to):e.None;function v(n,t){const r=t.pop(),e=t.pop();return t.push(r),t.push(e),0}function d(n,t){const r=t.pop(),e=t.pop();return t.push(r.cons(e)),0}function y(n,t){w&&w(n,t);const e=t.pop(),c=e.first(),h=e.rest();if(!o.isCons(c)){const[n,r]=function(n,t){let r=f.PATH_LOOKUP_BASE_COST;if(r+=f.PATH_LOOKUP_COST_PER_LEG,n.nullp())return u.t(r,i.SExp.null());const e=n.atom;let c=0;for(;cc||wh)throw new a.EvalError("cost exceeded",i.SExp.to(h));return u.t(g,m[m.length-1])}},351:function(n,t,r){"use strict";Object.defineProperty(t,"un",{value:!0}),t.sexp_buffer_from_stream=t.sexp_from_stream=t.sexp_to_stream=t.atom_to_byte_iterator=t.sexp_to_byte_iterator=void 0;const e=r(593),i=r(959),o=r(629),u=127;function*f(n){const t=[n];for(;t.length;){const r=(n=t.pop()).as_pair();r?(yield new e.Bytes(new Uint8Array([255])),t.push(r[1]),t.push(r[0])):yield*a(n.atom)}}function*a(n){const t=n?n.length:0;if(0===t||!n)return void(yield new e.Bytes(new Uint8Array([128])));if(1===t&&n.get_byte_at(0)<=127)return void(yield n);let r;if(t<64)r=Uint8Array.from([128|t]);else if(t<8192)r=Uint8Array.from([192|t>>8,t>>0&255]);else if(t<1048576)r=Uint8Array.from([224|t>>16,t>>8&255,t>>0&255]);else if(t<134217728)r=Uint8Array.from([240|t>>24,t>>16&255,t>>8&255,t>>0&255]);else{if(!(t<17179869184))throw new Error(`sexp too long ${n}`);r=Uint8Array.from([248|t/2**32>>0,t/2**24>>0&255,t/65536>>0&255,t/256>>0&255,t/1>>0&255])}const i=new e.Bytes(r);yield i,yield n}function c(n,t,r,o){const f=r.read(1);if(0===f.length)throw new Error("bad encoding");const a=f.get_byte_at(0);if(255===a)return n.push(s),n.push(c),void n.push(c);t.push(function(n,t,r){if(128===t)return r(e.Bytes.NULL);if(t<=u)return r(e.Bytes.from([t]));let o=0,f=128;for(;t&f;)o+=1,t&=255^f,f>>=1;let a=e.Bytes.from([t]);if(o>1){const t=n.read(o-1);if(t.length!==o-1)throw new Error("bad encoding");a=a.concat(t)}const c=i.int_from_bytes(a);if(c>=17179869184)throw new Error("blob too large");const s=n.read(c);if(s.length!==c)throw new Error("bad encoding");return r(s)}(r,a,o))}function s(n,t,r,i){const o=t.pop(),u=t.pop();t.push(i(e.t(u,o)))}function h(n){const t=n.read(1);if(0===t.length)throw new Error("bad encoding");const r=t.get_byte_at(0);return 255===r?e.t(t,2):e.t(function(n,t){if(128===t)return e.Bytes.from([t]);if(t<=u)return e.Bytes.from([t]);let r=0,o=128,f=t;for(;f&o;)r+=1,f&=255^o,o>>=1;let a=e.Bytes.from([f]);if(r>1){const t=n.read(r-1);if(t.length!==r-1)throw new Error("bad encoding");a=a.concat(t)}const c=i.int_from_bytes(a);if(c>=17179869184)throw new Error("blob too large");const s=n.read(c);if(s.length!==c)throw new Error("bad encoding");return e.Bytes.from([t]).concat(a.slice(1)).concat(s)}(n,r),0)}t.sexp_to_byte_iterator=f,t.atom_to_byte_iterator=a,t.sexp_to_stream=function(n,t){for(const r of f(n))t.write(r)},t.sexp_from_stream=function(n,t){const r=[c],e=[];for(;r.length;){const t=r.pop();t&&t(r,e,n,(n=>new o.CLVMObject(n)))}return t(e.pop())},t.sexp_buffer_from_stream=function(n){const t=new e.Stream;let r=1;for(;r>0;){r-=1;const[e,i]=h(n);r+=i,t.write(e)}return t.getValue()}},135:function(){},33:function(){},794:function(){},845:function(){}},t={},function r(e){var i=t[e];if(void 0!==i)return i.exports;var o=t[e]={exports:{}};return n[e].call(o.exports,o,o.exports,r),o.exports}(465);var n,t})); \ No newline at end of file diff --git a/.dist/npm/casts.d.ts b/.dist/npm/casts.d.ts deleted file mode 100644 index a53fd65..0000000 --- a/.dist/npm/casts.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { int, None } from "./__python_types__"; -import { Bytes } from "./__type_compatibility__"; -export declare function int_from_bytes(b: Bytes | None): int; -export declare function int_to_bytes(v: int): Bytes; -/** - * Return the number of bytes required to represent this integer. - * @param {int} v - */ -export declare function limbs_for_int(v: int): int; diff --git a/.dist/npm/casts.js b/.dist/npm/casts.js deleted file mode 100644 index 6b6e511..0000000 --- a/.dist/npm/casts.js +++ /dev/null @@ -1,47 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.limbs_for_int = exports.int_to_bytes = exports.int_from_bytes = void 0; -const __type_compatibility__1 = require("./__type_compatibility__"); -// In javascript, max safe integer is 2**53-1 (53bit) -// Surprisingly, parseInt() can parse over 32bit integer. -function int_from_bytes(b) { - if (!b || b.length === 0) { - return 0; - } - const unsigned32 = parseInt(b.hex(), 16); - // If the first bit is 1, it is recognized as a negative number. - if (b.get_byte_at(0) & 0x80) { - return unsigned32 - (1 << (b.length * 8)); - } - return unsigned32; -} -exports.int_from_bytes = int_from_bytes; -function int_to_bytes(v) { - if (v > Number.MAX_SAFE_INTEGER || v < Number.MIN_SAFE_INTEGER) { - throw new Error(`The int value is beyond ${v > 0 ? "MAX_SAFE_INTEGER" : "MIN_SAFE_INTEGER"}: ${v}`); - } - if (v === 0) { - return __type_compatibility__1.Bytes.NULL; - } - const byte_count = ((v < 0 ? -v : v).toString(2).length + 8) >> 3; - let hexStr = (v >>> 0).toString(16); - if (v >= 0) { - hexStr = hexStr.length % 2 ? `0${hexStr}` : hexStr; - } - while (hexStr.length / 2 < byte_count) { - hexStr = "00" + hexStr; - } - while (hexStr.length > 2 && hexStr.substr(0, 2) === (parseInt(hexStr.substr(2, 2), 16) & 0x80 ? "ff" : "00")) { - hexStr = hexStr.substr(2); - } - return __type_compatibility__1.h(hexStr); -} -exports.int_to_bytes = int_to_bytes; -/** - * Return the number of bytes required to represent this integer. - * @param {int} v - */ -function limbs_for_int(v) { - return ((v < 0 ? -v : v).toString(2).length + 7) >> 3; -} -exports.limbs_for_int = limbs_for_int; diff --git a/.dist/npm/core_ops.d.ts b/.dist/npm/core_ops.d.ts deleted file mode 100644 index 4cdb6c4..0000000 --- a/.dist/npm/core_ops.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { SExp } from "./SExp"; -export declare function op_if(args: SExp): import("./__type_compatibility__").Tuple; -export declare function op_cons(args: SExp): import("./__type_compatibility__").Tuple; -export declare function op_first(args: SExp): import("./__type_compatibility__").Tuple; -export declare function op_rest(args: SExp): import("./__type_compatibility__").Tuple; -export declare function op_listp(args: SExp): import("./__type_compatibility__").Tuple; -export declare function op_raise(args: SExp): void; -export declare function op_eq(args: SExp): import("./__type_compatibility__").Tuple; diff --git a/.dist/npm/core_ops.js b/.dist/npm/core_ops.js deleted file mode 100644 index f49dee5..0000000 --- a/.dist/npm/core_ops.js +++ /dev/null @@ -1,66 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.op_eq = exports.op_raise = exports.op_listp = exports.op_rest = exports.op_first = exports.op_cons = exports.op_if = void 0; -const SExp_1 = require("./SExp"); -const __type_compatibility__1 = require("./__type_compatibility__"); -const costs_1 = require("./costs"); -const EvalError_1 = require("./EvalError"); -function op_if(args) { - if (args.list_len() !== 3) { - throw new EvalError_1.EvalError("i takes exactly 3 arguments", args); - } - const r = args.rest(); - if (args.first().nullp()) { - return __type_compatibility__1.t(costs_1.IF_COST, r.rest().first()); - } - return __type_compatibility__1.t(costs_1.IF_COST, r.first()); -} -exports.op_if = op_if; -function op_cons(args) { - if (args.list_len() !== 2) { - throw new EvalError_1.EvalError("c takes exactly 2 arguments", args); - } - return __type_compatibility__1.t(costs_1.CONS_COST, args.first().cons(args.rest().first())); -} -exports.op_cons = op_cons; -function op_first(args) { - if (args.list_len() !== 1) { - throw new EvalError_1.EvalError("f takes exactly 1 argument", args); - } - return __type_compatibility__1.t(costs_1.FIRST_COST, args.first().first()); -} -exports.op_first = op_first; -function op_rest(args) { - if (args.list_len() !== 1) { - throw new EvalError_1.EvalError("r takes exactly 1 argument", args); - } - return __type_compatibility__1.t(costs_1.REST_COST, args.first().rest()); -} -exports.op_rest = op_rest; -function op_listp(args) { - if (args.list_len() !== 1) { - throw new EvalError_1.EvalError("l takes exactly 1 argument", args); - } - return __type_compatibility__1.t(costs_1.LISTP_COST, args.first().listp() ? SExp_1.SExp.TRUE : SExp_1.SExp.FALSE); -} -exports.op_listp = op_listp; -function op_raise(args) { - throw new EvalError_1.EvalError("clvm raise", args); -} -exports.op_raise = op_raise; -function op_eq(args) { - if (args.list_len() !== 2) { - throw new EvalError_1.EvalError("= takes exactly 2 arguments", args); - } - const a0 = args.first(); - const a1 = args.rest().first(); - if (a0.pair || a1.pair) { - throw new EvalError_1.EvalError("= on list", a0.pair ? a0 : a1); - } - const b0 = a0.atom; - const b1 = a1.atom; - let cost = costs_1.EQ_BASE_COST; - cost += (b0.length + b1.length) * costs_1.EQ_COST_PER_BYTE; - return __type_compatibility__1.t(cost, b0.equal_to(b1) ? SExp_1.SExp.TRUE : SExp_1.SExp.FALSE); -} -exports.op_eq = op_eq; diff --git a/.dist/npm/costs.d.ts b/.dist/npm/costs.d.ts deleted file mode 100644 index 8d42f63..0000000 --- a/.dist/npm/costs.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -export declare const IF_COST = 33; -export declare const CONS_COST = 50; -export declare const FIRST_COST = 30; -export declare const REST_COST = 30; -export declare const LISTP_COST = 19; -export declare const MALLOC_COST_PER_BYTE = 10; -export declare const ARITH_BASE_COST = 99; -export declare const ARITH_COST_PER_BYTE = 3; -export declare const ARITH_COST_PER_ARG = 320; -export declare const LOG_BASE_COST = 100; -export declare const LOG_COST_PER_BYTE = 3; -export declare const LOG_COST_PER_ARG = 264; -export declare const GRS_BASE_COST = 117; -export declare const GRS_COST_PER_BYTE = 1; -export declare const EQ_BASE_COST = 117; -export declare const EQ_COST_PER_BYTE = 1; -export declare const GR_BASE_COST = 498; -export declare const GR_COST_PER_BYTE = 2; -export declare const DIVMOD_BASE_COST = 1116; -export declare const DIVMOD_COST_PER_BYTE = 6; -export declare const DIV_BASE_COST = 988; -export declare const DIV_COST_PER_BYTE = 4; -export declare const SHA256_BASE_COST = 87; -export declare const SHA256_COST_PER_ARG = 134; -export declare const SHA256_COST_PER_BYTE = 2; -export declare const POINT_ADD_BASE_COST = 101094; -export declare const POINT_ADD_COST_PER_ARG = 1343980; -export declare const PUBKEY_BASE_COST = 1325730; -export declare const PUBKEY_COST_PER_BYTE = 38; -export declare const MUL_BASE_COST = 92; -export declare const MUL_COST_PER_OP = 885; -export declare const MUL_LINEAR_COST_PER_BYTE = 6; -export declare const MUL_SQUARE_COST_PER_BYTE_DIVIDER = 128; -export declare const STRLEN_BASE_COST = 173; -export declare const STRLEN_COST_PER_BYTE = 1; -export declare const PATH_LOOKUP_BASE_COST = 40; -export declare const PATH_LOOKUP_COST_PER_LEG = 4; -export declare const PATH_LOOKUP_COST_PER_ZERO_BYTE = 4; -export declare const CONCAT_BASE_COST = 142; -export declare const CONCAT_COST_PER_ARG = 135; -export declare const CONCAT_COST_PER_BYTE = 3; -export declare const BOOL_BASE_COST = 200; -export declare const BOOL_COST_PER_ARG = 300; -export declare const ASHIFT_BASE_COST = 596; -export declare const ASHIFT_COST_PER_BYTE = 3; -export declare const LSHIFT_BASE_COST = 277; -export declare const LSHIFT_COST_PER_BYTE = 3; -export declare const LOGNOT_BASE_COST = 331; -export declare const LOGNOT_COST_PER_BYTE = 3; -export declare const APPLY_COST = 90; -export declare const QUOTE_COST = 20; diff --git a/.dist/npm/costs.js b/.dist/npm/costs.js deleted file mode 100644 index fa4e040..0000000 --- a/.dist/npm/costs.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.APPLY_COST = exports.LOGNOT_COST_PER_BYTE = exports.LOGNOT_BASE_COST = exports.LSHIFT_COST_PER_BYTE = exports.LSHIFT_BASE_COST = exports.ASHIFT_COST_PER_BYTE = exports.ASHIFT_BASE_COST = exports.BOOL_COST_PER_ARG = exports.BOOL_BASE_COST = exports.CONCAT_COST_PER_BYTE = exports.CONCAT_COST_PER_ARG = exports.CONCAT_BASE_COST = exports.PATH_LOOKUP_COST_PER_ZERO_BYTE = exports.PATH_LOOKUP_COST_PER_LEG = exports.PATH_LOOKUP_BASE_COST = exports.STRLEN_COST_PER_BYTE = exports.STRLEN_BASE_COST = exports.MUL_SQUARE_COST_PER_BYTE_DIVIDER = exports.MUL_LINEAR_COST_PER_BYTE = exports.MUL_COST_PER_OP = exports.MUL_BASE_COST = exports.PUBKEY_COST_PER_BYTE = exports.PUBKEY_BASE_COST = exports.POINT_ADD_COST_PER_ARG = exports.POINT_ADD_BASE_COST = exports.SHA256_COST_PER_BYTE = exports.SHA256_COST_PER_ARG = exports.SHA256_BASE_COST = exports.DIV_COST_PER_BYTE = exports.DIV_BASE_COST = exports.DIVMOD_COST_PER_BYTE = exports.DIVMOD_BASE_COST = exports.GR_COST_PER_BYTE = exports.GR_BASE_COST = exports.EQ_COST_PER_BYTE = exports.EQ_BASE_COST = exports.GRS_COST_PER_BYTE = exports.GRS_BASE_COST = exports.LOG_COST_PER_ARG = exports.LOG_COST_PER_BYTE = exports.LOG_BASE_COST = exports.ARITH_COST_PER_ARG = exports.ARITH_COST_PER_BYTE = exports.ARITH_BASE_COST = exports.MALLOC_COST_PER_BYTE = exports.LISTP_COST = exports.REST_COST = exports.FIRST_COST = exports.CONS_COST = exports.IF_COST = void 0; -exports.QUOTE_COST = void 0; -exports.IF_COST = 33; -exports.CONS_COST = 50; -exports.FIRST_COST = 30; -exports.REST_COST = 30; -exports.LISTP_COST = 19; -exports.MALLOC_COST_PER_BYTE = 10; -exports.ARITH_BASE_COST = 99; -exports.ARITH_COST_PER_BYTE = 3; -exports.ARITH_COST_PER_ARG = 320; -exports.LOG_BASE_COST = 100; -exports.LOG_COST_PER_BYTE = 3; -exports.LOG_COST_PER_ARG = 264; -exports.GRS_BASE_COST = 117; -exports.GRS_COST_PER_BYTE = 1; -exports.EQ_BASE_COST = 117; -exports.EQ_COST_PER_BYTE = 1; -exports.GR_BASE_COST = 498; -exports.GR_COST_PER_BYTE = 2; -exports.DIVMOD_BASE_COST = 1116; -exports.DIVMOD_COST_PER_BYTE = 6; -exports.DIV_BASE_COST = 988; -exports.DIV_COST_PER_BYTE = 4; -exports.SHA256_BASE_COST = 87; -exports.SHA256_COST_PER_ARG = 134; -exports.SHA256_COST_PER_BYTE = 2; -exports.POINT_ADD_BASE_COST = 101094; -exports.POINT_ADD_COST_PER_ARG = 1343980; -exports.PUBKEY_BASE_COST = 1325730; -exports.PUBKEY_COST_PER_BYTE = 38; -exports.MUL_BASE_COST = 92; -exports.MUL_COST_PER_OP = 885; -exports.MUL_LINEAR_COST_PER_BYTE = 6; -exports.MUL_SQUARE_COST_PER_BYTE_DIVIDER = 128; -exports.STRLEN_BASE_COST = 173; -exports.STRLEN_COST_PER_BYTE = 1; -exports.PATH_LOOKUP_BASE_COST = 40; -exports.PATH_LOOKUP_COST_PER_LEG = 4; -exports.PATH_LOOKUP_COST_PER_ZERO_BYTE = 4; -exports.CONCAT_BASE_COST = 142; -exports.CONCAT_COST_PER_ARG = 135; -exports.CONCAT_COST_PER_BYTE = 3; -exports.BOOL_BASE_COST = 200; -exports.BOOL_COST_PER_ARG = 300; -exports.ASHIFT_BASE_COST = 596; -exports.ASHIFT_COST_PER_BYTE = 3; -exports.LSHIFT_BASE_COST = 277; -exports.LSHIFT_COST_PER_BYTE = 3; -exports.LOGNOT_BASE_COST = 331; -exports.LOGNOT_COST_PER_BYTE = 3; -exports.APPLY_COST = 90; -exports.QUOTE_COST = 20; diff --git a/.dist/npm/index.d.ts b/.dist/npm/index.d.ts deleted file mode 100644 index b2977f8..0000000 --- a/.dist/npm/index.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { SExp } from "./SExp"; -export * from "./__debug__"; -export * from "./__bls_signatures__"; -export * from "./__python_types__"; -export * from "./__type_compatibility__"; -export * from "./as_javascript"; -export * from "./casts"; -export * from "./CLVMObject"; -export * from "./core_ops"; -export * from "./costs"; -export * from "./EvalError"; -export * from "./initialize"; -export * from "./more_ops"; -export * from "./op_utils"; -export * from "./operators"; -export * from "./run_program"; -export * from "./serialize"; -export * from "./SExp"; -export declare const to_sexp_f: typeof SExp.to; diff --git a/.dist/npm/index.js b/.dist/npm/index.js deleted file mode 100644 index 8f37299..0000000 --- a/.dist/npm/index.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.to_sexp_f = void 0; -const SExp_1 = require("./SExp"); -__exportStar(require("./__debug__"), exports); -__exportStar(require("./__bls_signatures__"), exports); -__exportStar(require("./__python_types__"), exports); -__exportStar(require("./__type_compatibility__"), exports); -__exportStar(require("./as_javascript"), exports); -__exportStar(require("./casts"), exports); -__exportStar(require("./CLVMObject"), exports); -__exportStar(require("./core_ops"), exports); -__exportStar(require("./costs"), exports); -__exportStar(require("./EvalError"), exports); -__exportStar(require("./initialize"), exports); -__exportStar(require("./more_ops"), exports); -__exportStar(require("./op_utils"), exports); -__exportStar(require("./operators"), exports); -__exportStar(require("./run_program"), exports); -__exportStar(require("./serialize"), exports); -__exportStar(require("./SExp"), exports); -exports.to_sexp_f = SExp_1.SExp.to; diff --git a/.dist/npm/initialize.d.ts b/.dist/npm/initialize.d.ts deleted file mode 100644 index bef382a..0000000 --- a/.dist/npm/initialize.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Always call and wait this async function to be finished to initialize async bls module loading. - */ -export declare function initialize(): Promise; diff --git a/.dist/npm/initialize.js b/.dist/npm/initialize.js deleted file mode 100644 index d748737..0000000 --- a/.dist/npm/initialize.js +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.initialize = void 0; -const __bls_signatures__1 = require("./__bls_signatures__"); -/** - * Always call and wait this async function to be finished to initialize async bls module loading. - */ -function initialize() { - return __awaiter(this, void 0, void 0, function* () { - yield __bls_signatures__1.initializeBLS(); - }); -} -exports.initialize = initialize; diff --git a/.dist/npm/more_ops.d.ts b/.dist/npm/more_ops.d.ts deleted file mode 100644 index 8cf30f8..0000000 --- a/.dist/npm/more_ops.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { SExp } from "./SExp"; -import { Tuple } from "./__type_compatibility__"; -import { int, str } from "./__python_types__"; -export declare function malloc_cost(cost: int, atom: SExp): Tuple; -export declare function op_sha256(args: SExp): Tuple; -export declare function args_as_ints(op_name: str, args: SExp): Generator, void, unknown>; -export declare function args_as_int32(op_name: str, args: SExp): Generator; -export declare function args_as_int_list(op_name: str, args: SExp, count: int): Tuple[]; -export declare function args_as_bools(op_name: str, args: SExp): Generator; -export declare function args_as_bool_list(op_name: str, args: SExp, count: int): SExp[]; -export declare function op_add(args: SExp): Tuple; -export declare function op_subtract(args: SExp): Tuple; -export declare function op_multiply(args: SExp): Tuple; -export declare function op_divmod(args: SExp): Tuple; -export declare function op_div(args: SExp): Tuple; -export declare function op_gr(args: SExp): Tuple; -export declare function op_gr_bytes(args: SExp): Tuple; -export declare function op_pubkey_for_exp(items: SExp): Tuple; -export declare function op_strlen(args: SExp): Tuple; -export declare function op_substr(args: SExp): Tuple; -export declare function op_concat(args: SExp): Tuple; -export declare function op_ash(args: SExp): Tuple; -export declare function op_lsh(args: SExp): Tuple; -export declare function binop_reduction(op_name: str, initial_value: number, args: SExp, op_f: Function): Tuple; -export declare function op_logand(args: SExp): Tuple; -export declare function op_logior(args: SExp): Tuple; -export declare function op_logxor(args: SExp): Tuple; -export declare function op_lognot(args: SExp): Tuple; -export declare function op_not(args: SExp): Tuple; -export declare function op_any(args: SExp): Tuple; -export declare function op_all(args: SExp): Tuple; -export declare function op_softfork(args: SExp): Tuple; diff --git a/.dist/npm/more_ops.js b/.dist/npm/more_ops.js deleted file mode 100644 index ed80d08..0000000 --- a/.dist/npm/more_ops.js +++ /dev/null @@ -1,438 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.op_softfork = exports.op_all = exports.op_any = exports.op_not = exports.op_lognot = exports.op_logxor = exports.op_logior = exports.op_logand = exports.binop_reduction = exports.op_lsh = exports.op_ash = exports.op_concat = exports.op_substr = exports.op_strlen = exports.op_pubkey_for_exp = exports.op_gr_bytes = exports.op_gr = exports.op_div = exports.op_divmod = exports.op_multiply = exports.op_subtract = exports.op_add = exports.args_as_bool_list = exports.args_as_bools = exports.args_as_int_list = exports.args_as_int32 = exports.args_as_ints = exports.op_sha256 = exports.malloc_cost = void 0; -const SHA256_1 = require("jscrypto/SHA256"); -const SExp_1 = require("./SExp"); -const costs_1 = require("./costs"); -const __type_compatibility__1 = require("./__type_compatibility__"); -const EvalError_1 = require("./EvalError"); -const casts_1 = require("./casts"); -const CLVMObject_1 = require("./CLVMObject"); -const __bls_signatures__1 = require("./__bls_signatures__"); -function malloc_cost(cost, atom) { - if (!atom.atom) { - throw new EvalError_1.EvalError("atom is None", atom); - } - return __type_compatibility__1.t(cost + atom.atom.length * costs_1.MALLOC_COST_PER_BYTE, atom); -} -exports.malloc_cost = malloc_cost; -function op_sha256(args) { - let cost = costs_1.SHA256_BASE_COST; - let arg_len = 0; - const h = new SHA256_1.SHA256(); - for (const _ of args.as_iter()) { - const atom = _.atom; - if (!atom) { - throw new EvalError_1.EvalError("sha256 on list", _); - } - arg_len += atom.length; - cost += costs_1.SHA256_COST_PER_ARG; - h.update(atom.as_word()); - } - cost += arg_len * costs_1.SHA256_COST_PER_BYTE; - return malloc_cost(cost, SExp_1.SExp.to(__type_compatibility__1.Bytes.from(h.finalize().toUint8Array()))); -} -exports.op_sha256 = op_sha256; -function* args_as_ints(op_name, args) { - for (const arg of args.as_iter()) { - if (arg.pair || !arg.atom) { - throw new EvalError_1.EvalError(`${op_name} requires int args`, arg); - } - yield __type_compatibility__1.t(arg.as_int(), arg.atom.length); - } -} -exports.args_as_ints = args_as_ints; -function* args_as_int32(op_name, args) { - for (const arg of args.as_iter()) { - if (arg.pair || !arg.atom) { - throw new EvalError_1.EvalError(`${op_name} requires int32 args`, arg); - } - else if (arg.atom.length > 4) { - throw new EvalError_1.EvalError(`${op_name} requires int32 args (with no leading zeros`, arg); - } - yield arg.as_int(); - } -} -exports.args_as_int32 = args_as_int32; -function args_as_int_list(op_name, args, count) { - const int_list = []; - for (const _ of args_as_ints(op_name, args)) - int_list.push(_); - if (int_list.length !== count) { - const plural = count !== 1 ? "s" : ""; - throw new EvalError_1.EvalError(`${op_name} takes exactly ${count} argument${plural}`, args); - } - return int_list; -} -exports.args_as_int_list = args_as_int_list; -function* args_as_bools(op_name, args) { - for (const arg of args.as_iter()) { - const v = arg.atom; - if (v === null || v === void 0 ? void 0 : v.equal_to(__type_compatibility__1.Bytes.NULL)) { - yield SExp_1.SExp.FALSE; - } - else { - yield SExp_1.SExp.TRUE; - } - } -} -exports.args_as_bools = args_as_bools; -function args_as_bool_list(op_name, args, count) { - const bool_list = []; - for (const _ of args_as_bools(op_name, args)) - bool_list.push(_); - if (bool_list.length !== count) { - const plural = count !== 1 ? "s" : ""; - throw new EvalError_1.EvalError(`${op_name} takes exactly ${count} argument${plural}`, args); - } - return bool_list; -} -exports.args_as_bool_list = args_as_bool_list; -function op_add(args) { - let total = 0; - let cost = costs_1.ARITH_BASE_COST; - let arg_size = 0; - for (const ints of args_as_ints("+", args)) { - const [r, l] = ints; - total += r; - arg_size += l; - cost += costs_1.ARITH_COST_PER_ARG; - } - cost += arg_size * costs_1.ARITH_COST_PER_BYTE; - return malloc_cost(cost, SExp_1.SExp.to(total)); -} -exports.op_add = op_add; -function op_subtract(args) { - let cost = costs_1.ARITH_BASE_COST; - if (args.nullp()) { - return malloc_cost(cost, SExp_1.SExp.to(0)); - } - let sign = 1; - let total = 0; - let arg_size = 0; - for (const ints of args_as_ints("-", args)) { - const [r, l] = ints; - total += sign * r; - sign = -1; - arg_size += l; - cost += costs_1.ARITH_COST_PER_BYTE; - } - cost += arg_size * costs_1.ARITH_COST_PER_BYTE; - return malloc_cost(cost, SExp_1.SExp.to(total)); -} -exports.op_subtract = op_subtract; -function op_multiply(args) { - let cost = costs_1.MUL_BASE_COST; - const operands = args_as_ints("*", args); - const res = operands.next(); - if (res.done) { - return malloc_cost(cost, SExp_1.SExp.to(1)); - } - let [v, vs] = res.value; - for (const o of operands) { - const [r, rs] = o; - cost += costs_1.MUL_COST_PER_OP; - cost += (rs + vs) * costs_1.MUL_LINEAR_COST_PER_BYTE; - cost += ((rs * vs) / costs_1.MUL_SQUARE_COST_PER_BYTE_DIVIDER) >> 0; - v = v * r; - vs = casts_1.limbs_for_int(v); - } - return malloc_cost(cost, SExp_1.SExp.to(v)); -} -exports.op_multiply = op_multiply; -function op_divmod(args) { - let cost = costs_1.DIVMOD_BASE_COST; - const [t1, t2] = args_as_int_list("divmod", args, 2); - const [i0, l0] = t1; - const [i1, l1] = t2; - if (i1 === 0) { - throw new EvalError_1.EvalError("divmod with 0", SExp_1.SExp.to(i0)); - } - cost += (l0 + l1) * costs_1.DIVMOD_COST_PER_BYTE; - const q = (i0 / i1) >> 0; - const r = i0 % i1; - const q1 = SExp_1.SExp.to(q); - const r1 = SExp_1.SExp.to(r); - cost += (q1.atom.length + r1.atom.length) * costs_1.MALLOC_COST_PER_BYTE; - return __type_compatibility__1.t(cost, SExp_1.SExp.to(__type_compatibility__1.t(q, r))); -} -exports.op_divmod = op_divmod; -function op_div(args) { - let cost = costs_1.DIV_BASE_COST; - const [t1, t2] = args_as_int_list("/", args, 2); - const [i0, l0] = t1; - const [i1, l1] = t2; - if (i1 === 0) { - throw new EvalError_1.EvalError("div with 0", SExp_1.SExp.to(i0)); - } - cost += (l0 + l1) * costs_1.DIV_COST_PER_BYTE; - const q = (i0 / i1) >> 0; - return malloc_cost(cost, SExp_1.SExp.to(q)); -} -exports.op_div = op_div; -function op_gr(args) { - const [t1, t2] = args_as_int_list(">", args, 2); - const [i0, l0] = t1; - const [i1, l1] = t2; - let cost = costs_1.GR_BASE_COST; - cost += (l0 + l1) * costs_1.GR_COST_PER_BYTE; - return __type_compatibility__1.t(cost, i0 > i1 ? SExp_1.SExp.TRUE : SExp_1.SExp.FALSE); -} -exports.op_gr = op_gr; -function op_gr_bytes(args) { - const arg_list = []; - for (const _ of args.as_iter()) - arg_list.push(_); - if (arg_list.length !== 2) { - throw new EvalError_1.EvalError(">s takes exactly 2 arguments", args); - } - const [a0, a1] = arg_list; - if (a0.pair || a1.pair) { - throw new EvalError_1.EvalError(">s on list", a0.pair ? a0 : a1); - } - const b0 = a0.atom; - const b1 = a1.atom; - let cost = costs_1.GRS_BASE_COST; - cost += (b0.length + b1.length) * costs_1.GRS_COST_PER_BYTE; - return __type_compatibility__1.t(cost, b0.compare(b1) > 0 /* b0 > b1 */ ? SExp_1.SExp.TRUE : SExp_1.SExp.FALSE); -} -exports.op_gr_bytes = op_gr_bytes; -function op_pubkey_for_exp(items) { - let cost = costs_1.POINT_ADD_BASE_COST; - const { G1Element } = __bls_signatures__1.getBLSModule(); - let p = new G1Element(); - for (const _ of items.as_iter()) { - if (!CLVMObject_1.isAtom(_)) { - throw new EvalError_1.EvalError("point_add on list", _); - } - try { - const atom_g1 = __bls_signatures__1.G1Element_from_bytes(_.atom.data()); - p = __bls_signatures__1.G1Element_add(p, atom_g1); - cost += costs_1.POINT_ADD_COST_PER_ARG; - } - catch (e) { - throw new EvalError_1.EvalError(`point_add expects blob, got ${_.atom}: ${JSON.stringify(e)}`, items); - } - } - return malloc_cost(cost, SExp_1.SExp.to(p)); -} -exports.op_pubkey_for_exp = op_pubkey_for_exp; -function op_strlen(args) { - if (args.list_len() !== 1) { - throw new EvalError_1.EvalError("strlen takes exactly 1 argument", args); - } - const a0 = args.first(); - if (!CLVMObject_1.isAtom(a0)) { - throw new EvalError_1.EvalError("strlen on list", a0); - } - const size = a0.atom.length; - const cost = costs_1.STRLEN_BASE_COST + size * costs_1.STRLEN_COST_PER_BYTE; - return malloc_cost(cost, SExp_1.SExp.to(size)); -} -exports.op_strlen = op_strlen; -function op_substr(args) { - const arg_count = args.list_len(); - if (![2, 3].includes(arg_count)) { - throw new EvalError_1.EvalError("substr takes exactly 2 or 3 arguments", args); - } - const a0 = args.first(); - if (!CLVMObject_1.isAtom(a0)) { - throw new EvalError_1.EvalError("substr on list", a0); - } - const s0 = a0.atom; - let i1; - let i2; - if (arg_count === 2) { - i1 = args_as_int32("substr", args.rest()).next().value; - i2 = s0.length; - } - else { - const ints = []; - for (const i of args_as_int32("substr", args.rest())) { - ints.push(i); - } - ([i1, i2] = ints); - } - if (i2 > s0.length || i2 < i1 || i2 < 0 || i1 < 0) { - throw new EvalError_1.EvalError("invalid indices for substr", args); - } - const s = s0.slice(i1, i2); - const cost = 1; - return __type_compatibility__1.t(cost, SExp_1.SExp.to(s)); -} -exports.op_substr = op_substr; -function op_concat(args) { - let cost = costs_1.CONCAT_BASE_COST; - const s = new __type_compatibility__1.Stream(); - for (const arg of args.as_iter()) { - if (!CLVMObject_1.isAtom(arg)) { - throw new EvalError_1.EvalError("concat on list", arg); - } - s.write(arg.atom); - cost += costs_1.CONCAT_COST_PER_ARG; - } - const r = s.getValue(); - cost += r.length * costs_1.CONCAT_COST_PER_BYTE; - return malloc_cost(cost, SExp_1.SExp.to(r)); -} -exports.op_concat = op_concat; -function op_ash(args) { - const [t1, t2] = args_as_int_list("ash", args, 2); - const [i0, l0] = t1; - const [i1, l1] = t2; - if (l1 > 4) { - throw new EvalError_1.EvalError("ash requires int32 args (with no leading zeros)", args.rest().first()); - } - else if (Math.abs(i1) > 65535) { - throw new EvalError_1.EvalError("shift too large", SExp_1.SExp.to(i1)); - } - let r; - if (i1 >= 0) { - r = i0 << i1; - } - else { - r = i0 >> -i1; - } - let cost = costs_1.ASHIFT_BASE_COST; - cost += (l0 + casts_1.limbs_for_int(r)) * costs_1.ASHIFT_COST_PER_BYTE; - return malloc_cost(cost, SExp_1.SExp.to(r)); -} -exports.op_ash = op_ash; -function op_lsh(args) { - const [t1, t2] = args_as_int_list("lsh", args, 2); - const l0 = t1[1]; - const [i1, l1] = t2; - if (l1 > 4) { - throw new EvalError_1.EvalError("lsh requires int32 args (with no leading zeros)", args.rest().first()); - } - else if (Math.abs(i1) > 65535) { - throw new EvalError_1.EvalError("shift too large", SExp_1.SExp.to(i1)); - } - // we actually want i0 to be an *unsigned* int - const a0 = args.first().atom; - const i0 = casts_1.int_from_bytes(a0); - let r; - if (i1 >= 0) { - r = i0 << i1; - } - else { - r = i0 >> -i1; - } - let cost = costs_1.LSHIFT_BASE_COST; - cost += (l0 + casts_1.limbs_for_int(r)) * costs_1.LSHIFT_COST_PER_BYTE; - return malloc_cost(cost, SExp_1.SExp.to(r)); -} -exports.op_lsh = op_lsh; -// eslint-disable-next-line @typescript-eslint/ban-types -function binop_reduction(op_name, initial_value, args, op_f) { - let total = initial_value; - let arg_size = 0; - let cost = costs_1.LOG_BASE_COST; - for (const t of args_as_ints(op_name, args)) { - const [r, l] = t; - total = op_f(total, r); - arg_size += l; - cost += costs_1.LOG_COST_PER_ARG; - } - cost += arg_size * costs_1.LOG_COST_PER_BYTE; - return malloc_cost(cost, SExp_1.SExp.to(total)); -} -exports.binop_reduction = binop_reduction; -function op_logand(args) { - const binop = (a, b) => { - a &= b; - return a; - }; - return binop_reduction("logand", -1, args, binop); -} -exports.op_logand = op_logand; -function op_logior(args) { - const binop = (a, b) => { - a |= b; - return a; - }; - return binop_reduction("logior", 0, args, binop); -} -exports.op_logior = op_logior; -function op_logxor(args) { - const binop = (a, b) => { - a ^= b; - return a; - }; - return binop_reduction("logxor", 0, args, binop); -} -exports.op_logxor = op_logxor; -function op_lognot(args) { - const t = args_as_int_list("lognot", args, 1); - const [i0, l0] = t[0]; - const cost = costs_1.LOGNOT_BASE_COST + l0 * costs_1.LOGNOT_COST_PER_BYTE; - return malloc_cost(cost, SExp_1.SExp.to(~i0)); -} -exports.op_lognot = op_lognot; -function op_not(args) { - const boolList = args_as_bool_list("not", args, 1); - const i0 = boolList[0]; - if (!CLVMObject_1.isAtom(i0)) { - throw new EvalError_1.EvalError("not on list", args); - } - let r; - if (i0.atom.equal_to(__type_compatibility__1.Bytes.NULL)) { - r = SExp_1.SExp.TRUE; - } - else { - r = SExp_1.SExp.FALSE; - } - return __type_compatibility__1.t(costs_1.BOOL_BASE_COST, SExp_1.SExp.to(r)); -} -exports.op_not = op_not; -function op_any(args) { - const items = []; - for (const _ of args_as_bools("any", args)) - items.push(_); - const cost = costs_1.BOOL_BASE_COST + items.length * costs_1.BOOL_COST_PER_ARG; - let r = SExp_1.SExp.FALSE; - for (const v of items) { - if (!CLVMObject_1.isAtom(v)) { - throw new EvalError_1.EvalError("any on list", args); - } - if (!v.atom.equal_to(__type_compatibility__1.Bytes.NULL)) { - r = SExp_1.SExp.TRUE; - break; - } - } - return __type_compatibility__1.t(cost, SExp_1.SExp.to(r)); -} -exports.op_any = op_any; -function op_all(args) { - const items = []; - for (const _ of args_as_bools("all", args)) - items.push(_); - const cost = costs_1.BOOL_BASE_COST + items.length * costs_1.BOOL_COST_PER_ARG; - let r = SExp_1.SExp.TRUE; - for (const v of items) { - if (!CLVMObject_1.isAtom(v)) { - throw new EvalError_1.EvalError("all on list", args); - } - if (v.atom.equal_to(__type_compatibility__1.Bytes.NULL)) { - r = SExp_1.SExp.FALSE; - break; - } - } - return __type_compatibility__1.t(cost, SExp_1.SExp.to(r)); -} -exports.op_all = op_all; -function op_softfork(args) { - if (args.list_len() < 1) { - throw new EvalError_1.EvalError("softfork takes at least 1 argument", args); - } - const a = args.first(); - if (!CLVMObject_1.isAtom(a)) { - throw new EvalError_1.EvalError("softfork requires int args", a); - } - const cost = a.as_int(); - if (cost < 1) { - throw new EvalError_1.EvalError("cost must be > 0", args); - } - return __type_compatibility__1.t(cost, SExp_1.SExp.FALSE); -} -exports.op_softfork = op_softfork; diff --git a/.dist/npm/op_utils.d.ts b/.dist/npm/op_utils.d.ts deleted file mode 100644 index d7a927c..0000000 --- a/.dist/npm/op_utils.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { str } from "./__python_types__"; -import { SExp } from "./SExp"; -export declare function operators_for_dict(keyword_to_atom: Record, op_dict: Record, op_name_lookup: Record): Record unknown>; -export declare function operators_for_module(keyword_to_atom: Record, mod: Record, op_name_lookup?: Record): Record unknown>; diff --git a/.dist/npm/op_utils.js b/.dist/npm/op_utils.js deleted file mode 100644 index c415e8f..0000000 --- a/.dist/npm/op_utils.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.operators_for_module = exports.operators_for_dict = void 0; -function operators_for_dict(keyword_to_atom, op_dict, op_name_lookup) { - const d = {}; - for (const op of Object.keys(keyword_to_atom)) { - const op_name = `op_${op_name_lookup[op] || op}`; - const op_f = op_dict[op_name]; - if (typeof op_f === "function") { - d[keyword_to_atom[op]] = op_f; - } - } - return d; -} -exports.operators_for_dict = operators_for_dict; -function operators_for_module(keyword_to_atom, mod, op_name_lookup = {}) { - return operators_for_dict(keyword_to_atom, mod, op_name_lookup); -} -exports.operators_for_module = operators_for_module; diff --git a/.dist/npm/operators.d.ts b/.dist/npm/operators.d.ts deleted file mode 100644 index c8ada8c..0000000 --- a/.dist/npm/operators.d.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { int, str } from "./__python_types__"; -import { SExp } from "./SExp"; -import { Bytes, Tuple } from "./__type_compatibility__"; -import { CLVMObject } from "./CLVMObject"; -export declare const KEYWORD_FROM_ATOM: { - "00": string; - "01": string; - "02": string; - "03": string; - "04": string; - "05": string; - "06": string; - "07": string; - "08": string; - "09": string; - "0a": string; - "0b": string; - "0c": string; - "0d": string; - "0e": string; - "0f": string; - "10": string; - "11": string; - "12": string; - "13": string; - "14": string; - "15": string; - "16": string; - "17": string; - "18": string; - "19": string; - "1a": string; - "1b": string; - "1c": string; - "1d": string; - "1e": string; - "1f": string; - "20": string; - "21": string; - "22": string; - "23": string; - "24": string; -}; -export declare const KEYWORD_TO_ATOM: { - q: string; - a: string; - i: string; - c: string; - f: string; - r: string; - l: string; - x: string; - "=": string; - ">s": string; - sha256: string; - substr: string; - strlen: string; - concat: string; - "+": string; - "-": string; - "*": string; - "/": string; - divmod: string; - ">": string; - ash: string; - lsh: string; - logand: string; - logior: string; - logxor: string; - lognot: string; - point_add: string; - pubkey_for_exp: string; - not: string; - any: string; - all: string; - ".": string; - softfork: string; -}; -export declare const OP_REWRITE: { - "+": string; - "-": string; - "*": string; - "/": string; - i: string; - c: string; - f: string; - r: string; - l: string; - x: string; - "=": string; - ">": string; - ">s": string; -}; -export declare type ATOMS = keyof typeof KEYWORD_FROM_ATOM; -export declare type KEYWORDS = keyof typeof KEYWORD_TO_ATOM; -export declare function args_len(op_name: str, args: SExp): Generator; -export declare function default_unknown_op(op: Bytes, args: SExp): Tuple; -export declare const QUOTE_ATOM: Bytes; -export declare const APPLY_ATOM: Bytes; -declare type TOpFunc = (args: SExp) => R; -declare type TBasicAtom = "quote_atom" | "apply_atom"; -declare type TAtomOpFunctionMap = Record & Partial>; -export declare type TOperatorDict = { - unknown_op_handler: typeof default_unknown_op; -} & ((op: Bytes | string | number, args: SExp) => Tuple) & TAtomOpFunctionMap & Record; -export declare type TOperatorDictOption = { - quote_atom: Bytes; - apply_atom: Bytes; - unknown_op_handler: typeof default_unknown_op; -}; -export declare function OperatorDict(atom_op_function_map: TAtomOpFunctionMap | TOperatorDict, option?: Partial): TOperatorDict; -export declare const OPERATOR_LOOKUP: TOperatorDict<"00" | "01" | "02" | "03" | "04" | "05" | "06" | "07" | "08" | "09" | "0a" | "0b" | "0c" | "0d" | "0e" | "10" | "11" | "12" | "13" | "14" | "15" | "16" | "17" | "18" | "19" | "1a" | "1b" | "1d" | "1e" | "20" | "21" | "22" | "23" | "24" | "0f" | "1c" | "1f">; -export {}; diff --git a/.dist/npm/operators.js b/.dist/npm/operators.js deleted file mode 100644 index 3f1189a..0000000 --- a/.dist/npm/operators.js +++ /dev/null @@ -1,309 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.OPERATOR_LOOKUP = exports.OperatorDict = exports.APPLY_ATOM = exports.QUOTE_ATOM = exports.default_unknown_op = exports.args_len = exports.OP_REWRITE = exports.KEYWORD_TO_ATOM = exports.KEYWORD_FROM_ATOM = void 0; -const casts_1 = require("./casts"); -const SExp_1 = require("./SExp"); -const __type_compatibility__1 = require("./__type_compatibility__"); -const EvalError_1 = require("./EvalError"); -const costs_1 = require("./costs"); -const op_utils_1 = require("./op_utils"); -const core_ops = require("./core_ops"); -const more_ops = require("./more_ops"); -/* -export const KEYWORDS = [ - // core opcodes 0x01-x08 - ". q a i c f r l x ", - - // opcodes on atoms as strings 0x09-0x0f - "= >s sha256 substr strlen concat . ", - - // opcodes on atoms as ints 0x10-0x17 - "+ - * / divmod > ash lsh ", - - // opcodes on atoms as vectors of bools 0x18-0x1c - "logand logior logxor lognot . ", - - // opcodes for bls 1381 0x1d-0x1f - "point_add pubkey_for_exp . ", - - // bool opcodes 0x20-0x23 - "not any all . ", - - // misc 0x24 - "softfork ", -].join("").trim().split(/\s/); -export const KEYWORD_FROM_ATOM = Object - .entries(KEYWORDS) - .reduce>((acc, v) => { - acc[int_to_bytes(+v[0]).toString()] = v[1]; - return acc; - }, {}); -export const KEYWORD_TO_ATOM = Object - .entries(KEYWORD_FROM_ATOM) - .reduce>((acc, v) => { - acc[v[1]] = v[0]; - return acc; - }, {}); - */ -exports.KEYWORD_FROM_ATOM = { - "00": ".", - // core opcodes 0x01-x08 - "01": "q", - "02": "a", - "03": "i", - "04": "c", - "05": "f", - "06": "r", - "07": "l", - "08": "x", - // opcodes on atoms as strings 0x09-0x0f - "09": "=", - "0a": ">s", - "0b": "sha256", - "0c": "substr", - "0d": "strlen", - "0e": "concat", - "0f": ".", - // opcodes on atoms as ints 0x10-0x17 - "10": "+", - "11": "-", - "12": "*", - "13": "/", - "14": "divmod", - "15": ">", - "16": "ash", - "17": "lsh", - // opcodes on atoms as vectors of bools 0x18-0x1c - "18": "logand", - "19": "logior", - "1a": "logxor", - "1b": "lognot", - "1c": ".", - // opcodes for bls 1381 0x1d-0x1f - "1d": "point_add", - "1e": "pubkey_for_exp", - "1f": ".", - // bool opcodes 0x20-0x23 - "20": "not", - "21": "any", - "22": "all", - "23": ".", - // misc 0x24 - "24": "softfork", -}; -exports.KEYWORD_TO_ATOM = { - // ".": "00", - // core opcodes 0x01-x08 - "q": "01", - "a": "02", - "i": "03", - "c": "04", - "f": "05", - "r": "06", - "l": "07", - "x": "08", - // opcodes on atoms as strings 0x09-0x0f - "=": "09", - ">s": "0a", - "sha256": "0b", - "substr": "0c", - "strlen": "0d", - "concat": "0e", - // ".": "0f", - // opcodes on atoms as ints 0x10-0x17 - "+": "10", - "-": "11", - "*": "12", - "/": "13", - "divmod": "14", - ">": "15", - "ash": "16", - "lsh": "17", - // opcodes on atoms as vectors of bools 0x18-0x1c - "logand": "18", - "logior": "19", - "logxor": "1a", - "lognot": "1b", - // ".": "1c", - // opcodes for bls 1381 0x1d-0x1f - "point_add": "1d", - "pubkey_for_exp": "1e", - // ".": "1f", - // bool opcodes 0x20-0x23 - "not": "20", - "any": "21", - "all": "22", - ".": "23", - // misc 0x24 - "softfork": "24", -}; -exports.OP_REWRITE = { - "+": "add", - "-": "subtract", - "*": "multiply", - "/": "div", - "i": "if", - "c": "cons", - "f": "first", - "r": "rest", - "l": "listp", - "x": "raise", - "=": "eq", - ">": "gr", - ">s": "gr_bytes", -}; -function* args_len(op_name, args) { - for (const arg of args.as_iter()) { - if (arg.pair) { - throw new EvalError_1.EvalError(`${op_name} requires int args"`, arg); - } - yield arg.atom.length; - } -} -exports.args_len = args_len; -/* -# unknown ops are reserved if they start with 0xffff -# otherwise, unknown ops are no-ops, but they have costs. The cost is computed -# like this: - -# byte index (reverse): -# | 4 | 3 | 2 | 1 | 0 | -# +---+---+---+---+------------+ -# | multiplier |XX | XXXXXX | -# +---+---+---+---+---+--------+ -# ^ ^ ^ -# | | + 6 bits ignored when computing cost -# cost_multiplier | -# + 2 bits -# cost_function - -# 1 is always added to the multiplier before using it to multiply the cost, this -# is since cost may not be 0. - -# cost_function is 2 bits and defines how cost is computed based on arguments: -# 0: constant, cost is 1 * (multiplier + 1) -# 1: computed like operator add, multiplied by (multiplier + 1) -# 2: computed like operator mul, multiplied by (multiplier + 1) -# 3: computed like operator concat, multiplied by (multiplier + 1) - -# this means that unknown ops where cost_function is 1, 2, or 3, may still be -# fatal errors if the arguments passed are not atoms. - */ -function default_unknown_op(op, args) { - // # any opcode starting with ffff is reserved (i.e. fatal error) - // # opcodes are not allowed to be empty - if (op.length === 0 || op.slice(0, 2).equal_to(__type_compatibility__1.Bytes.from("0xffff", "hex"))) { - throw new EvalError_1.EvalError("reserved operator", SExp_1.SExp.to(op)); - } - /* - # all other unknown opcodes are no-ops - # the cost of the no-ops is determined by the opcode number, except the - # 6 least significant bits. - */ - const cost_function = (op.get_byte_at(op.length - 1) & 0b11000000) >> 6; - // # the multiplier cannot be 0. it starts at 1 - if (op.length > 5) { - throw new EvalError_1.EvalError("invalid operator", SExp_1.SExp.to(op)); - } - const cost_multiplier = casts_1.int_from_bytes(op.slice(0, op.length - 1)) + 1; - /* - # 0 = constant - # 1 = like op_add/op_sub - # 2 = like op_multiply - # 3 = like op_concat - */ - let cost; - if (cost_function === 0) { - cost = 1; - } - else if (cost_function === 1) { - cost = costs_1.ARITH_BASE_COST; - let arg_size = 0; - for (const length of args_len("unknown op", args)) { - arg_size += length; - cost += costs_1.ARITH_COST_PER_ARG; - } - cost += arg_size * costs_1.ARITH_COST_PER_BYTE; - } - else if (cost_function === 2) { - // # like op_multiply - cost = costs_1.MUL_BASE_COST; - const operands = args_len("unknown op", args); - const res = operands.next(); - if (!res.done) { - let vs = res.value; - for (const rs of operands) { - cost += costs_1.MUL_COST_PER_OP; - cost += (rs + vs) * costs_1.MUL_LINEAR_COST_PER_BYTE; - cost += ((rs * vs) / costs_1.MUL_SQUARE_COST_PER_BYTE_DIVIDER) >> 0; - vs += rs; - } - } - } - else if (cost_function === 3) { - // # like concat - cost = costs_1.CONCAT_BASE_COST; - let length = 0; - for (const arg of args.as_iter()) { - if (arg.pair) { - throw new EvalError_1.EvalError("unknown op on list", arg); - } - cost += costs_1.CONCAT_COST_PER_ARG; - length += arg.atom.length; - } - cost += length * costs_1.CONCAT_COST_PER_BYTE; - } - else { - throw new Error(`Invalid cost_function: ${cost_function}`); - } - cost *= cost_multiplier; - if (cost >= 2 ** 32) { - throw new EvalError_1.EvalError("invalid operator", SExp_1.SExp.to(op)); - } - return __type_compatibility__1.t(cost, SExp_1.SExp.null()); -} -exports.default_unknown_op = default_unknown_op; -exports.QUOTE_ATOM = __type_compatibility__1.Bytes.from(exports.KEYWORD_TO_ATOM["q"], "hex"); -exports.APPLY_ATOM = __type_compatibility__1.Bytes.from(exports.KEYWORD_TO_ATOM["a"], "hex"); -function merge(obj1, obj2) { - Object.keys(obj2).forEach(key => { - obj1[key] = obj2[key]; - }); -} -function OperatorDict(atom_op_function_map, option = {}) { - const dict = Object.assign(Object.assign({}, atom_op_function_map), { quote_atom: option.quote_atom || atom_op_function_map.quote_atom, apply_atom: option.apply_atom || atom_op_function_map.apply_atom, unknown_op_handler: option.unknown_op_handler || default_unknown_op }); - if (!dict.quote_atom) { - throw new Error("object has not attribute 'quote_atom'"); - } - else if (!dict.apply_atom) { - throw new Error("object has not attribute 'apply_atom'"); - } - const OperatorDict = function (op, args) { - if (typeof op === "string") { - op = __type_compatibility__1.Bytes.from(op, "hex"); - } - else if (typeof op === "number") { - op = __type_compatibility__1.Bytes.from([op]); - } - else if (!__type_compatibility__1.isBytes(op)) { - throw new Error(`Invalid op: ${JSON.stringify(op)}`); - } - merge(dict, OperatorDict); - const f = dict[op.hex()]; - if (typeof f !== "function") { - return dict.unknown_op_handler(op, args); - } - else { - return f(args); - } - }; - merge(OperatorDict, dict); - return OperatorDict; -} -exports.OperatorDict = OperatorDict; -const _OPERATOR_LOOKUP = OperatorDict(op_utils_1.operators_for_module(exports.KEYWORD_TO_ATOM, core_ops, exports.OP_REWRITE), { - quote_atom: exports.QUOTE_ATOM, - apply_atom: exports.APPLY_ATOM, -}); -merge(_OPERATOR_LOOKUP, op_utils_1.operators_for_module(exports.KEYWORD_TO_ATOM, more_ops, exports.OP_REWRITE)); -exports.OPERATOR_LOOKUP = _OPERATOR_LOOKUP; diff --git a/.dist/npm/package.json b/.dist/npm/package.json deleted file mode 100644 index 397b81e..0000000 --- a/.dist/npm/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "clvm", - "version": "0.0.19", - "author": "Admin ChiaMineJP ", - "description": "Javascript implementation of chia lisp", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/Chia-Mine/clvm-js.git" - }, - "bugs": "https://github.com/Chia-Mine/clvm-js/issues", - "main": "./index.js", - "typings": "./index.d.ts", - "scripts": { - "build": "node pre_build.js && tsc --sourcemap false && webpack", - "test": "jest" - }, - "keywords": [ - "chia", - "clvm", - "chialisp", - "typescript" - ], - "engines": { - "node": ">=12.13.0" - }, - "dependencies": { - "@chiamine/bls-signatures": "^0.2.1-beta.1", - "jscrypto": "^1.0.2" - }, - "devDependencies": { - "@types/jest": "^26.0.24", - "@types/node": "^15.0.2", - "@typescript-eslint/eslint-plugin": "^4.1.0", - "@typescript-eslint/parser": "^4.1.0", - "eslint": "^7.8.1", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-jsdoc": "^30.4.1", - "fork-ts-checker-webpack-plugin": "^6.2.12", - "jest": "^27.0.6", - "terser-webpack-plugin": "^5.1.3", - "ts-jest": "^27.0.3", - "ts-loader": "^9.2.3", - "typescript": "^4.2.4", - "webpack": "^5.39.1", - "webpack-cli": "^4.7.2" - } -} \ No newline at end of file diff --git a/.dist/npm/run_program.d.ts b/.dist/npm/run_program.d.ts deleted file mode 100644 index a5fb458..0000000 --- a/.dist/npm/run_program.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { int, None, uint8 } from "./__python_types__"; -import { SExp } from "./SExp"; -import { TToSexpF } from "./as_javascript"; -import { CLVMObject } from "./CLVMObject"; -import { Tuple } from "./__type_compatibility__"; -import { TOperatorDict } from "./operators"; -export declare type OpCallable = (opStack: OpStackType, valStack: ValStackType) => int; -export declare type ValStackType = SExp[]; -export declare type OpStackType = OpCallable[]; -export declare type TPreEvalF = (v1: SExp, v2: SExp) => unknown; -export declare function to_pre_eval_op(pre_eval_f: TPreEvalF, to_sexp_f: TToSexpF): (op_stack: OpStackType, value_stack: ValStackType) => void; -export declare function msb_mask(byte: uint8): number; -export declare function run_program(program: SExp, args: CLVMObject, operator_lookup: TOperatorDict, max_cost?: number | None, pre_eval_f?: TPreEvalF | None): Tuple; diff --git a/.dist/npm/run_program.js b/.dist/npm/run_program.js deleted file mode 100644 index 2f996a9..0000000 --- a/.dist/npm/run_program.js +++ /dev/null @@ -1,167 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.run_program = exports.msb_mask = exports.to_pre_eval_op = void 0; -const __python_types__1 = require("./__python_types__"); -const SExp_1 = require("./SExp"); -const CLVMObject_1 = require("./CLVMObject"); -const __type_compatibility__1 = require("./__type_compatibility__"); -const costs_1 = require("./costs"); -const EvalError_1 = require("./EvalError"); -function to_pre_eval_op(pre_eval_f, to_sexp_f) { - return function my_pre_eval_op(op_stack, value_stack) { - const v = to_sexp_f(value_stack[value_stack.length - 1]); - const context = pre_eval_f(v.first(), v.rest()); - if (typeof context === "function") { - const invoke_context_op = (op_stack, value_stack) => { - context(to_sexp_f(value_stack[value_stack.length - 1])); - return 0; - }; - op_stack.push(invoke_context_op); - } - }; -} -exports.to_pre_eval_op = to_pre_eval_op; -function msb_mask(byte) { - byte |= byte >> 1; - byte |= byte >> 2; - byte |= byte >> 4; - return (byte + 1) >> 1; -} -exports.msb_mask = msb_mask; -function run_program(program, args, operator_lookup, max_cost = __python_types__1.None, pre_eval_f = __python_types__1.None) { - program = SExp_1.SExp.to(program); - const pre_eval_op = pre_eval_f ? to_pre_eval_op(pre_eval_f, SExp_1.SExp.to) : __python_types__1.None; - function traverse_path(sexp, env) { - let cost = costs_1.PATH_LOOKUP_BASE_COST; - cost += costs_1.PATH_LOOKUP_COST_PER_LEG; - if (sexp.nullp()) { - return __type_compatibility__1.t(cost, SExp_1.SExp.null()); - } - const b = sexp.atom; - let end_byte_cursor = 0; - while (end_byte_cursor < b.length && b.get_byte_at(end_byte_cursor) === 0) { - end_byte_cursor += 1; - } - cost += end_byte_cursor * costs_1.PATH_LOOKUP_COST_PER_ZERO_BYTE; - if (end_byte_cursor === b.length) { - return __type_compatibility__1.t(cost, SExp_1.SExp.null()); - } - // # create a bitmask for the most significant *set* bit - // # in the last non-zero byte - const end_bitmask = msb_mask(b.get_byte_at(end_byte_cursor)); - let byte_cursor = b.length - 1; - let bitmask = 0x01; - while (byte_cursor > end_byte_cursor || bitmask < end_bitmask) { - if (!CLVMObject_1.isCons(env)) { - throw new EvalError_1.EvalError("path into atom", env); - } - if (b.get_byte_at(byte_cursor) & bitmask) { - env = env.rest(); - } - else { - env = env.first(); - } - cost += costs_1.PATH_LOOKUP_COST_PER_LEG; - bitmask <<= 1; - if (bitmask === 0x0100) { - byte_cursor -= 1; - bitmask = 0x01; - } - } - return __type_compatibility__1.t(cost, env); - } - function swap_op(op_stack, value_stack) { - const v2 = value_stack.pop(); - const v1 = value_stack.pop(); - value_stack.push(v2); - value_stack.push(v1); - return 0; - } - function cons_op(op_stack, value_stack) { - const v1 = value_stack.pop(); - const v2 = value_stack.pop(); - value_stack.push(v1.cons(v2)); - return 0; - } - function eval_op(op_stack, value_stack) { - if (pre_eval_op) { - pre_eval_op(op_stack, value_stack); - } - const pair = value_stack.pop(); - const sexp = pair.first(); - const args = pair.rest(); - // # put a bunch of ops on op_stack - if (!CLVMObject_1.isCons(sexp)) { - // # sexp is an atom - const [cost, r] = traverse_path(sexp, args); - value_stack.push(r); - return cost; - } - const operator = sexp.first(); - if (CLVMObject_1.isCons(operator)) { - const pair = operator.as_pair(); - const [new_operator, must_be_nil] = pair; - if (new_operator.pair || !__type_compatibility__1.Bytes.NULL.equal_to(must_be_nil.atom)) { - throw new EvalError_1.EvalError("in ((X)...) syntax X must be lone atom", sexp); - } - const new_operand_list = sexp.rest(); - value_stack.push(new_operator); - value_stack.push(new_operand_list); - op_stack.push(apply_op); - return costs_1.APPLY_COST; - } - const op = operator.atom; - let operand_list = sexp.rest(); - // op === operator_lookup.quote_atom - if (op.equal_to(operator_lookup.quote_atom)) { - value_stack.push(operand_list); - return costs_1.QUOTE_COST; - } - op_stack.push(apply_op); - value_stack.push(operator); - while (!operand_list.nullp()) { - const _ = operand_list.first(); - value_stack.push(_.cons(args)); - op_stack.push(cons_op); - op_stack.push(eval_op); - op_stack.push(swap_op); - operand_list = operand_list.rest(); - } - value_stack.push(SExp_1.SExp.null()); - return 1; - } - function apply_op(op_stack, value_stack) { - const operand_list = value_stack.pop(); - const operator = value_stack.pop(); - if (!CLVMObject_1.isAtom(operator)) { - throw new EvalError_1.EvalError("internal error", operator); - } - const op = operator.atom; - // op === operator_lookup.apply_atom - if (op.equal_to(operator_lookup.apply_atom)) { - if (operand_list.list_len() !== 2) { - throw new EvalError_1.EvalError("apply requires exactly 2 parameters", operand_list); - } - const new_program = operand_list.first(); - const new_args = operand_list.rest().first(); - value_stack.push(new_program.cons(new_args)); - op_stack.push(eval_op); - return costs_1.APPLY_COST; - } - const [additional_cost, r] = operator_lookup(op, operand_list); - value_stack.push(r); - return additional_cost; - } - const op_stack = [eval_op]; - const value_stack = [program.cons(args)]; - let cost = 0; - while (op_stack.length) { - const f = op_stack.pop(); - cost += f(op_stack, value_stack); - if (max_cost && cost > max_cost) { - throw new EvalError_1.EvalError("cost exceeded", SExp_1.SExp.to(max_cost)); - } - } - return __type_compatibility__1.t(cost, value_stack[value_stack.length - 1]); -} -exports.run_program = run_program; diff --git a/.dist/npm/serialize.d.ts b/.dist/npm/serialize.d.ts deleted file mode 100644 index 4810f5c..0000000 --- a/.dist/npm/serialize.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { SExp } from "./SExp"; -import { Bytes, Stream } from "./__type_compatibility__"; -import { None } from "./__python_types__"; -import { TToSexpF } from "./as_javascript"; -export declare function sexp_to_byte_iterator(sexp: SExp): Generator; -export declare function atom_to_byte_iterator(atom: Bytes | None): Generator; -export declare function sexp_to_stream(sexp: SExp, f: Stream): void; -export declare function sexp_from_stream(f: Stream, to_sexp_f: TToSexpF): SExp; -export declare function sexp_buffer_from_stream(f: Stream): Bytes; diff --git a/.dist/npm/serialize.js b/.dist/npm/serialize.js deleted file mode 100644 index ec07834..0000000 --- a/.dist/npm/serialize.js +++ /dev/null @@ -1,211 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.sexp_buffer_from_stream = exports.sexp_from_stream = exports.sexp_to_stream = exports.atom_to_byte_iterator = exports.sexp_to_byte_iterator = void 0; -const __type_compatibility__1 = require("./__type_compatibility__"); -const casts_1 = require("./casts"); -const CLVMObject_1 = require("./CLVMObject"); -const MAX_SINGLE_BYTE = 0x7F; -const CONS_BOX_MARKER = 0xFF; -function* sexp_to_byte_iterator(sexp) { - const todo_stack = [sexp]; - while (todo_stack.length) { - sexp = todo_stack.pop(); - const pair = sexp.as_pair(); - if (pair) { - // yield Bytes.from([CONS_BOX_MARKER]); - yield new __type_compatibility__1.Bytes(new Uint8Array([CONS_BOX_MARKER])); - todo_stack.push(pair[1]); - todo_stack.push(pair[0]); - } - else { - yield* atom_to_byte_iterator(sexp.atom); - } - } -} -exports.sexp_to_byte_iterator = sexp_to_byte_iterator; -function* atom_to_byte_iterator(atom) { - const size = atom ? atom.length : 0; - if (size === 0 || !atom) { - // yield Bytes.from("0x80", "hex"); - yield new __type_compatibility__1.Bytes(new Uint8Array([0x80])); - return; - } - else if (size === 1) { - if (atom.get_byte_at(0) <= MAX_SINGLE_BYTE) { - yield atom; - return; - } - } - let uint8array; - if (size < 0x40) { - uint8array = Uint8Array.from([0x80 | size]); - } - else if (size < 0x2000) { - uint8array = Uint8Array.from([ - 0xC0 | (size >> 8), - (size >> 0) & 0xFF, - ]); - } - else if (size < 0x100000) { - uint8array = Uint8Array.from([ - 0xE0 | (size >> 16), - (size >> 8) & 0xFF, - (size >> 0) & 0xFF, - ]); - } - else if (size < 0x8000000) { - uint8array = Uint8Array.from([ - 0xF0 | (size >> 24), - (size >> 16) & 0xFF, - (size >> 8) & 0xFF, - (size >> 0) & 0xFF, - ]); - } - else if (size < 0x400000000) { - uint8array = Uint8Array.from([ - 0xF8 | ((size / 2 ** 32) >> 0), - ((size / 2 ** 24) >> 0) & 0xFF, - ((size / 2 ** 16) >> 0) & 0xFF, - ((size / 2 ** 8) >> 0) & 0xFF, - ((size / 2 ** 0) >> 0) & 0xFF, - ]); - } - else { - throw new Error(`sexp too long ${atom}`); - } - const size_blob = new __type_compatibility__1.Bytes(uint8array); - yield size_blob; - yield atom; - return; -} -exports.atom_to_byte_iterator = atom_to_byte_iterator; -function sexp_to_stream(sexp, f) { - for (const b of sexp_to_byte_iterator(sexp)) { - f.write(b); - } -} -exports.sexp_to_stream = sexp_to_stream; -function _op_read_sexp(op_stack, val_stack, f, to_sexp_f) { - const blob = f.read(1); - if (blob.length === 0) { - throw new Error("bad encoding"); - } - const b = blob.get_byte_at(0); - if (b === CONS_BOX_MARKER) { - op_stack.push(_op_cons); - op_stack.push(_op_read_sexp); - op_stack.push(_op_read_sexp); - return; - } - val_stack.push(_atom_from_stream(f, b, to_sexp_f)); -} -function _op_cons(op_stack, val_stack, f, to_sexp_f) { - const right = val_stack.pop(); - const left = val_stack.pop(); - val_stack.push(to_sexp_f(__type_compatibility__1.t(left, right))); -} -function sexp_from_stream(f, to_sexp_f) { - const op_stack = [_op_read_sexp]; - const val_stack = []; - while (op_stack.length) { - const func = op_stack.pop(); - if (func) { - func(op_stack, val_stack, f, ((v) => new CLVMObject_1.CLVMObject(v))); - } - } - return to_sexp_f(val_stack.pop()); -} -exports.sexp_from_stream = sexp_from_stream; -function _op_consume_sexp(f) { - const blob = f.read(1); - if (blob.length === 0) { - throw new Error("bad encoding"); - } - const b = blob.get_byte_at(0); - if (b === CONS_BOX_MARKER) { - return __type_compatibility__1.t(blob, 2); - } - return __type_compatibility__1.t(_consume_atom(f, b), 0); -} -function _consume_atom(f, b) { - if (b === 0x80) { - return __type_compatibility__1.Bytes.from([b]); - } - else if (b <= MAX_SINGLE_BYTE) { - return __type_compatibility__1.Bytes.from([b]); - } - let bit_count = 0; - let bit_mask = 0x80; - let ll = b; - while (ll & bit_mask) { - bit_count += 1; - ll &= 0xFF ^ bit_mask; - bit_mask >>= 1; - } - let size_blob = __type_compatibility__1.Bytes.from([ll]); - if (bit_count > 1) { - const ll2 = f.read(bit_count - 1); - if (ll2.length !== bit_count - 1) { - throw new Error("bad encoding"); - } - size_blob = size_blob.concat(ll2); - } - const size = casts_1.int_from_bytes(size_blob); - if (size >= 0x400000000) { - throw new Error("blob too large"); - } - const blob = f.read(size); - if (blob.length !== size) { - throw new Error("bad encoding"); - } - return __type_compatibility__1.Bytes.from([b]).concat(size_blob.slice(1)).concat(blob); -} -/* -# instead of parsing the input stream, this function pulls out all the bytes -# that represent on S-expression tree, and returns them. This is more efficient -# than parsing and returning a python S-expression tree. - */ -function sexp_buffer_from_stream(f) { - const buffer = new __type_compatibility__1.Stream(); - let depth = 1; - while (depth > 0) { - depth -= 1; - const [buf, d] = _op_consume_sexp(f); - depth += d; - buffer.write(buf); - } - return buffer.getValue(); -} -exports.sexp_buffer_from_stream = sexp_buffer_from_stream; -function _atom_from_stream(f, b, to_sexp_f) { - if (b === 0x80) { - return to_sexp_f(__type_compatibility__1.Bytes.NULL); - } - else if (b <= MAX_SINGLE_BYTE) { - return to_sexp_f(__type_compatibility__1.Bytes.from([b])); - } - let bit_count = 0; - let bit_mask = 0x80; - while (b & bit_mask) { - bit_count += 1; - b &= 0xFF ^ bit_mask; - bit_mask >>= 1; - } - let size_blob = __type_compatibility__1.Bytes.from([b]); - if (bit_count > 1) { - const bin = f.read(bit_count - 1); - if (bin.length !== bit_count - 1) { - throw new Error("bad encoding"); - } - size_blob = size_blob.concat(bin); - } - const size = casts_1.int_from_bytes(size_blob); - if (size >= 0x400000000) { - throw new Error("blob too large"); - } - const blob = f.read(size); - if (blob.length !== size) { - throw new Error("bad encoding"); - } - return to_sexp_f(blob); -} diff --git a/.gitignore b/.gitignore index 39445b0..fde3686 100644 --- a/.gitignore +++ b/.gitignore @@ -258,3 +258,4 @@ $RECYCLE.BIN/ .npmrc build/ playground/ +.dist/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 65aacf4..fc8059b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [1.0.0] +### Removed +- Removed `.dist` folder from git. + - This folder made it harder to check diffs between versions. + ## [0.0.19] **There are 2 breaking changes.** @@ -148,6 +153,7 @@ At this version, I've managed to improve test complete time to `79s` -> `2s` by Initial (beta) release. +[1.0.0]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.19...v1.0.0 [0.0.19]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.18...v0.0.19 [0.0.18]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.17...v0.0.18 [0.0.17]: https://github.com/Chia-Mine/clvm-js/compare/v0.0.16...v0.0.17 From f42d1fc9901f822fb8447e034060a6c15e2ffb24 Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 12:22:32 +0900 Subject: [PATCH 02/16] Updated README --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7ee6bf4..134e0d7 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ # clvm Javascript implementation of CLVM (Chia Lisp VM) -Still Work in progress.(Untested) - -**v0.x.x is test purpose only!** -Please report bugs to https://github.com/Chia-Mine/clvm-js/issues ## Install ```shell @@ -13,6 +9,11 @@ npm install clvm yarn add clvm ``` +## Compatibility +This code is compatible with: +- [`1a5cb17895d8707f784a85180bc97d3c6ebe71a0`](https://github.com/Chia-Network/clvm/tree/1a5cb17895d8707f784a85180bc97d3c6ebe71a0) of [clvm@0.9.7](https://github.com/Chia-Network/clvm) + - [Diff to the latest clvm](https://github.com/Chia-Network/clvm/compare/1a5cb17895d8707f784a85180bc97d3c6ebe71a0...main) + ## Example ```javascript // in nodejs context From d1c5cbeeb1a6eec297165e7ea0b4faf0f61c2350 Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 12:41:49 +0900 Subject: [PATCH 03/16] Added GitHub Action --- .github/workflow/main.yml | 48 +++++++++++++++++++++++++++++++++++++++ CHANGELOG.md | 2 ++ 2 files changed, 50 insertions(+) create mode 100644 .github/workflow/main.yml diff --git a/.github/workflow/main.yml b/.github/workflow/main.yml new file mode 100644 index 0000000..95a1344 --- /dev/null +++ b/.github/workflow/main.yml @@ -0,0 +1,48 @@ +name: Test + +on: + push: + branches: + - '*' + - '!master' + pull_request: + branches: + - '*' + - '!master' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup Node 14 + uses: actions/setup-node@v1 + with: + node-version: '14.x' + + - name: Get yarn version + run: echo "yarn_version=$(yarn -v)" >> $GITHUB_ENV + + - name: Get yarn(v1) cache directory path + if: startsWith(env.yarn_version, '1') + run: echo "cache_dir=$(yarn cache dir)" >> $GITHUB_ENV + + - name: Get yarn(v2) cache directory path + if: startsWith(env.yarn_version, '2') + run: echo "cache_dir=$(yarn config get cacheFolder)" + + - name: Cache Node.js modules + id: yarn-cache + uses: actions/cache@v2 + with: + path: ${{ env.cache_dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install dependencies + run: yarn --frozen-lockfile + + - run: yarn build + - run: yarn test \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index fc8059b..da0a71a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Removed - Removed `.dist` folder from git. - This folder made it harder to check diffs between versions. +### Added +- Added GitHub Action ## [0.0.19] From ae3abcd6b1203ff6fb7200bf20a14bb366b70795 Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 12:44:19 +0900 Subject: [PATCH 04/16] Fixed GitHub workflow directory name --- .github/{workflow => workflows}/main.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{workflow => workflows}/main.yml (100%) diff --git a/.github/workflow/main.yml b/.github/workflows/main.yml similarity index 100% rename from .github/workflow/main.yml rename to .github/workflows/main.yml From 43bb29a7c62df4307d321e078b4f2229cef6194c Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 12:49:48 +0900 Subject: [PATCH 05/16] Fixed a build issue --- pre_build.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pre_build.js b/pre_build.js index 7d9d0df..29975c6 100644 --- a/pre_build.js +++ b/pre_build.js @@ -2,14 +2,16 @@ const path = require("path"); const fs = require("fs"); // clean and create output dir -const distDir = path.join(__dirname, ".dist", "npm"); +const distDir = path.join(__dirname, ".dist"); if(fs.existsSync(distDir)){ fs.rmdirSync(distDir, {recursive: true}); } fs.mkdirSync(distDir); +const distNpmDir = path.join(distDir, "npm"); +fs.mkdirSync(distNpmDir); // Copy wasm file -const browserDir = path.join(distDir, "browser"); +const browserDir = path.join(distNpmDir, "browser"); if(fs.existsSync(browserDir)){ fs.rmdirSync(browserDir, {recursive: true}); } @@ -26,11 +28,11 @@ fs.copyFileSync(blsWasmSrcPath, blsWasmDestPath); const packageJson = require("./package.json"); -fs.writeFileSync(path.join(distDir, "package.json"), JSON.stringify(packageJson, null, 2)); +fs.writeFileSync(path.join(distNpmDir, "package.json"), JSON.stringify(packageJson, null, 2)); function copyFileToPublish(fileName){ const srcPath = path.join(__dirname, fileName); - const distPath = path.join(distDir, fileName); + const distPath = path.join(distNpmDir, fileName); if(fs.existsSync(srcPath)){ fs.copyFileSync(srcPath, distPath); } From e967e7cc276e93d7ab4371b9d2db0db5f7e2870c Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 15:11:15 +0900 Subject: [PATCH 06/16] Updated README --- CHANGELOG.md | 2 ++ README.md | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index da0a71a..49916ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ - This folder made it harder to check diffs between versions. ### Added - Added GitHub Action +### Changed +- Updated README.md ## [0.0.19] diff --git a/README.md b/README.md index 134e0d7..5e16a6a 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,91 @@ you need to put `blsjs.wasm` to the same directory as the code who loads `clvm`. If so, you can make your code fully synchronous. +## Differences with Python's `clvm` +Although I try hard to make it look like Python's `clvm`, there are things users should take it into account. +I put the code which absorbs language incompatibility into `src/__type_compaibility__.ts`, so if you're interested take a look at it. + +### There are no build-in `Tuple` type in Javascript +When you want to create a tuple, you need to write like this: +```javascript +const {t} = require("clvm"); +const aTuple = t(1, 2); + +// Tuple is Array-Like object +aTuple[0] === 1; // true +aTuple[1] === 2; // true + +// Tuple content cannot be changed +aTuple[0] = 99; +aTuple[0] === 99; // false +aTuple[0] === 1; // true + +// Tuple accepts only 2 elements. +const tuple2 = t(1, 2, 3); +tuple2; // (1, 2) + +// You can check if a variable is a tuple +const {isTuple} = require("clvm"); +isTuple([1, 2]); // false +isTuple(t(1, 2)); // true +``` +Just add `t` in front of tuple parenthesis `(1, 2)` and you get a tuple. + +### There are no build-in `bytes` type in JavaScript +This is the most notable difference with Python. +I used to be a JavaScript developer for several years, and sometimes I heard Python is slow and JavaScript is fast. +But working on the project, I truly surprised that Python can handle byte data really well in ways: +- Python's `bytes` is **immutable** and can be used as a dict key. +- Python's `bytes` is fast and easy to write. + `b'aaa' + b'bbb' == b'aaabbb'`, `b'a' * 3 == b'aaa'` +- Python's `bytes` comparison is FAST. + If you are interested, compare the performance of `test_very_long_blobs` in `tests/serialize_test.[ts|py]` + See more details [here](https://github.com/Chia-Network/clvm/pull/100) + +```javascript +const {b} = require("clvm"); +// Turns string to UTF-8 byte array. +b("abc"); // will be { Uint8Array(3) [97,98,99] } +b("あ"); // will be { Uint8Array(3) [227,129,130] } + +// If you want to do Byte comparison, use equal_to method. +b("abc").equal_to(b("abc")); // true +b("abc") === b("abc"); // false. Because it is just an instance of a Bytes class and not immutable. + +// Initialize Bytes instance with hex string +const {h} = require("clvm"); +h("0x616263"); // will be { Uint8Array(3) [97,98,99] } +h("616263"); // You can omit '0x' prefix +h("0x616263").equal_to(b("abc")); // true + +// +: Bytes concat +b("a").concat(b("b")); // === b("ab") +// *: Bytes repeat +b("a").repeat(3); // === b("aaa") + +// Bytes initialization +const {Bytes} = require("clvm"); +uint8 = new Uint8Array([97, 98, 99]); +b1 = Bytes.from(uint8); +b1.equal_to(b("abc")); // true +// Initializing by Bytes.from copies value and cut reference apart. +uint8[0] = 0; +b1.get_byte_at(0); // 97 +// Initializing by new Bytes() just stores value and keep reference, for better performance +uint8 = new Uint8Array([97, 98, 99]); +b2 = new Bytes(uint8); +b2.equal_to(b("abc")); // true +uint8[0] = 0; +b2.get_byte_at(0); // 0 +``` + +### Python's `str(x)` is `x.toString()` in Javascript +If you want to stringify `SExp` or `Bytes`, just call `x.toString()` method. +```javascript +const {b, SExp} = require("clvm"); +b("あ").toString(); // "b'\\xe3\\x81\\x82'" +SExp.to([1, [2, 3]]).toString(); // 'ff01ffff02ff038080' +``` ## clvm license `clvm-js` is based on [clvm](https://github.com/Chia-Network/clvm) with the From 1e9e64442c56c5def22d906106950b836cb88bdc Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 15:29:53 +0900 Subject: [PATCH 07/16] Changed method name `Bytes::get_byte_at` to `Bytes::at` --- CHANGELOG.md | 1 + README.md | 4 ++-- src/__type_compatibility__.ts | 4 ++-- src/casts.ts | 2 +- src/operators.ts | 2 +- src/run_program.ts | 6 +++--- src/serialize.ts | 6 +++--- tests/to_sexp_test.ts | 4 ++-- 8 files changed, 15 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49916ce..292eac6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Added GitHub Action ### Changed - Updated README.md +- Changed method name `Bytes::get_byte_at` to `Bytes::at` (Breaking change) ## [0.0.19] diff --git a/README.md b/README.md index 5e16a6a..a2b0816 100644 --- a/README.md +++ b/README.md @@ -126,13 +126,13 @@ b1 = Bytes.from(uint8); b1.equal_to(b("abc")); // true // Initializing by Bytes.from copies value and cut reference apart. uint8[0] = 0; -b1.get_byte_at(0); // 97 +b1.at(0); // 97 // Initializing by new Bytes() just stores value and keep reference, for better performance uint8 = new Uint8Array([97, 98, 99]); b2 = new Bytes(uint8); b2.equal_to(b("abc")); // true uint8[0] = 0; -b2.get_byte_at(0); // 0 +b2.at(0); // 0 ``` ### Python's `str(x)` is `x.toString()` in Javascript diff --git a/src/__type_compatibility__.ts b/src/__type_compatibility__.ts index e487ed3..e24d864 100644 --- a/src/__type_compatibility__.ts +++ b/src/__type_compatibility__.ts @@ -145,7 +145,7 @@ export class Bytes { return this._b.length; } - public get_byte_at(i: number){ + public at(i: number){ return this._b[i] | 0; } @@ -314,7 +314,7 @@ export function isIterable(v: any): v is unknown[] { export function isBytes(v: any): v is Bytes { return v && typeof v.length === "number" - && typeof v.get_byte_at === "function" + && typeof v.at === "function" && typeof v.raw === "function" && typeof v.data === "function" && typeof v.hex === "function" diff --git a/src/casts.ts b/src/casts.ts index dc69760..789bff6 100644 --- a/src/casts.ts +++ b/src/casts.ts @@ -9,7 +9,7 @@ export function int_from_bytes(b: Bytes|None): int { } const unsigned32 = parseInt(b.hex(), 16); // If the first bit is 1, it is recognized as a negative number. - if(b.get_byte_at(0) & 0x80){ + if(b.at(0) & 0x80){ return unsigned32 - (1 << (b.length*8)); } return unsigned32; diff --git a/src/operators.ts b/src/operators.ts index cf5cde4..b6e181c 100644 --- a/src/operators.ts +++ b/src/operators.ts @@ -216,7 +216,7 @@ export function default_unknown_op(op: Bytes, args: SExp): Tuple> 6; + const cost_function = (op.at(op.length-1) & 0b11000000) >> 6; // # the multiplier cannot be 0. it starts at 1 if(op.length > 5){ diff --git a/src/run_program.ts b/src/run_program.ts index 8a36e25..5607636 100644 --- a/src/run_program.ts +++ b/src/run_program.ts @@ -60,7 +60,7 @@ export function run_program( const b = sexp.atom as Bytes; let end_byte_cursor = 0; - while(end_byte_cursor < b.length && b.get_byte_at(end_byte_cursor) === 0){ + while(end_byte_cursor < b.length && b.at(end_byte_cursor) === 0){ end_byte_cursor += 1; } @@ -71,7 +71,7 @@ export function run_program( // # create a bitmask for the most significant *set* bit // # in the last non-zero byte - const end_bitmask = msb_mask(b.get_byte_at(end_byte_cursor)); + const end_bitmask = msb_mask(b.at(end_byte_cursor)); let byte_cursor = b.length - 1; let bitmask = 0x01; @@ -79,7 +79,7 @@ export function run_program( if(!isCons(env)){ throw new EvalError("path into atom", env); } - if(b.get_byte_at(byte_cursor) & bitmask){ + if(b.at(byte_cursor) & bitmask){ env = env.rest(); } else{ diff --git a/src/serialize.ts b/src/serialize.ts index 2381ec6..7ef9d56 100644 --- a/src/serialize.ts +++ b/src/serialize.ts @@ -49,7 +49,7 @@ export function* atom_to_byte_iterator(atom: Bytes|None){ return; } else if(size === 1){ - if(atom.get_byte_at(0) <= MAX_SINGLE_BYTE){ + if(atom.at(0) <= MAX_SINGLE_BYTE){ yield atom; return; } @@ -110,7 +110,7 @@ function _op_read_sexp(op_stack: TOpStack, val_stack: TValStack, f: Stream, to_s if(blob.length === 0){ throw new Error("bad encoding"); } - const b = blob.get_byte_at(0); + const b = blob.at(0); if(b === CONS_BOX_MARKER){ op_stack.push(_op_cons); op_stack.push(_op_read_sexp); @@ -145,7 +145,7 @@ function _op_consume_sexp(f: Stream){ if(blob.length === 0){ throw new Error("bad encoding"); } - const b = blob.get_byte_at(0); + const b = blob.at(0); if(b === CONS_BOX_MARKER){ return t(blob, 2); } diff --git a/tests/to_sexp_test.ts b/tests/to_sexp_test.ts index 2e8f88c..d8348a3 100644 --- a/tests/to_sexp_test.ts +++ b/tests/to_sexp_test.ts @@ -29,7 +29,7 @@ function print_leaves(tree: SExp): string { if(a.length === 0){ return "() "; } - return `${a.get_byte_at(0)} `; + return `${a.at(0)} `; } let ret = ""; @@ -45,7 +45,7 @@ function print_tree(tree: SExp): string { if(a.length === 0){ return "() "; } - return `${a.get_byte_at(0)} `; + return `${a.at(0)} `; } let ret = "("; From 25d16177a3f33c0850d22b50bfea783afc917d24 Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 15:51:55 +0900 Subject: [PATCH 08/16] Fixed a minor issue --- src/SExp.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SExp.ts b/src/SExp.ts index 7cbbcb2..88180ca 100644 --- a/src/SExp.ts +++ b/src/SExp.ts @@ -210,7 +210,7 @@ export class SExp implements CLVMType { } public nullp(){ - return this.atom !== None && this.atom.raw().length === 0; + return this.atom !== None && this.atom.length === 0; } public as_int(){ From 8599e06ae225375ade35e65e3dea9191edce0f93 Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 15:52:44 +0900 Subject: [PATCH 09/16] Added `str()`, `repr()` utility functions --- CHANGELOG.md | 1 + src/__type_compatibility__.ts | 24 +++++++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 292eac6..6bd5105 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - This folder made it harder to check diffs between versions. ### Added - Added GitHub Action +- Added `str()`, `repr()` utility functions. ### Changed - Updated README.md - Changed method name `Bytes::get_byte_at` to `Bytes::at` (Breaking change) diff --git a/src/__type_compatibility__.ts b/src/__type_compatibility__.ts index e24d864..92de941 100644 --- a/src/__type_compatibility__.ts +++ b/src/__type_compatibility__.ts @@ -2,7 +2,7 @@ import {Hex} from "jscrypto/Hex"; import {Utf8} from "jscrypto/Utf8"; import {Word32Array} from "jscrypto/Word32Array"; import {SHA256} from "jscrypto/SHA256"; -import {None, str} from "./__python_types__"; +import {None} from "./__python_types__"; import {G1Element} from "@chiamine/bls-signatures"; export function to_hexstr(r: Uint8Array) { @@ -85,7 +85,7 @@ export class Bytes { } } - public static from(value?: Uint8Array|Bytes|number[]|str|G1Element|None, type?: BytesFromType){ + public static from(value?: Uint8Array|Bytes|number[]|string|G1Element|None, type?: BytesFromType){ if(value === None || value === undefined){ return new Bytes(value); } @@ -121,7 +121,7 @@ export class Bytes { throw new Error(`Invalid value: ${JSON.stringify(value)}`); } - public static SHA256(value: str|Bytes|Uint8Array){ + public static SHA256(value: string|Bytes|Uint8Array){ let w; if(typeof value === "string"){ w = SHA256.hash(value); @@ -256,11 +256,11 @@ export class Bytes { } } -export function b(utf8Str: str, type:"utf8"|"hex" = "utf8"){ +export function b(utf8Str: string, type:"utf8"|"hex" = "utf8"){ return Bytes.from(utf8Str, type); } -export function h(hexStr: str){ +export function h(hexStr: string){ return Bytes.from(hexStr, "hex"); } @@ -272,6 +272,20 @@ export function list(iterable: Iterable){ return arr; } +export function str(x: any){ + if(typeof x.toString === "function"){ + return x.toString(); + } + return `${x}`; +} + +export function repr(x: any){ + if(typeof x.__repr__ === "function"){ + return x.__repr__(); + } + return str(x); +} + export class Tuple extends Array { public constructor(...items: [T1, T2]) { super(...items); From 8b013c86f4c69e4ff4c54195b21629ebf8a8f2c0 Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 16:38:07 +0900 Subject: [PATCH 10/16] Deprecated python specific type definition such as `str`, `int` --- CHANGELOG.md | 2 ++ src/EvalError.ts | 3 +-- src/SExp.ts | 6 +++--- src/__python_types__.ts | 5 ++--- src/casts.ts | 10 +++++----- src/more_ops.ts | 21 ++++++++++----------- src/op_utils.ts | 15 +++++++-------- src/operators.ts | 17 ++++++++--------- src/run_program.ts | 22 +++++++++++----------- 9 files changed, 49 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bd5105..d7454e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ ### Changed - Updated README.md - Changed method name `Bytes::get_byte_at` to `Bytes::at` (Breaking change) +### Deprecated +- Deprecated python specific type definition such as `str`, `int`. Use `string`, `number` instead. ## [0.0.19] diff --git a/src/EvalError.ts b/src/EvalError.ts index 90db00c..cbf3974 100644 --- a/src/EvalError.ts +++ b/src/EvalError.ts @@ -1,11 +1,10 @@ -import type {str} from "./__python_types__"; import type {CLVMObject} from "./CLVMObject"; export class EvalError extends Error { public _sexp?: CLVMObject; name = "EvalError"; - public constructor(message: str, sexp: CLVMObject) { + public constructor(message: string, sexp: CLVMObject) { super(message); this._sexp = sexp; } diff --git a/src/SExp.ts b/src/SExp.ts index 88180ca..fbea89c 100644 --- a/src/SExp.ts +++ b/src/SExp.ts @@ -1,5 +1,5 @@ import {G1Element} from "@chiamine/bls-signatures"; -import {int, None, Optional, str} from "./__python_types__"; +import {None, Optional} from "./__python_types__"; import {CLVMObject, CLVMType} from "./CLVMObject"; import {Bytes, isIterable, Tuple, t, Stream, isBytes, isTuple} from "./__type_compatibility__"; import {int_from_bytes, int_to_bytes} from "./casts"; @@ -10,8 +10,8 @@ import {EvalError} from "./EvalError"; export type CastableType = SExp | CLVMType | Bytes -| str -| int +| string +| number | None | G1Element | CastableType[] diff --git a/src/__python_types__.ts b/src/__python_types__.ts index 2afe73e..bdb52cb 100644 --- a/src/__python_types__.ts +++ b/src/__python_types__.ts @@ -1,3 +1,4 @@ +/* export type int = number; export type int8 = number; export type uint8 = number; @@ -9,14 +10,12 @@ export type int64 = BigInt; export type uint64 = BigInt; export type uint128 = BigInt; export type int512 = BigInt; - export type float = number; - export type str = string; export type bool = boolean; - export type True = true; export type False = false; +*/ export const None = null; // eslint-disable-next-line no-redeclare export type None = null; diff --git a/src/casts.ts b/src/casts.ts index 789bff6..80fe4ec 100644 --- a/src/casts.ts +++ b/src/casts.ts @@ -1,9 +1,9 @@ -import {int, None} from "./__python_types__"; +import {None} from "./__python_types__"; import {Bytes, h} from "./__type_compatibility__"; // In javascript, max safe integer is 2**53-1 (53bit) // Surprisingly, parseInt() can parse over 32bit integer. -export function int_from_bytes(b: Bytes|None): int { +export function int_from_bytes(b: Bytes|None): number { if(!b || b.length === 0){ return 0; } @@ -15,7 +15,7 @@ export function int_from_bytes(b: Bytes|None): int { return unsigned32; } -export function int_to_bytes(v: int): Bytes { +export function int_to_bytes(v: number): Bytes { if(v > Number.MAX_SAFE_INTEGER || v < Number.MIN_SAFE_INTEGER){ throw new Error(`The int value is beyond ${v > 0 ? "MAX_SAFE_INTEGER" : "MIN_SAFE_INTEGER"}: ${v}`); } @@ -41,8 +41,8 @@ export function int_to_bytes(v: int): Bytes { /** * Return the number of bytes required to represent this integer. - * @param {int} v + * @param {number} v */ -export function limbs_for_int(v: int): int { +export function limbs_for_int(v: number): number { return ((v < 0 ? -v : v).toString(2).length + 7) >> 3; } diff --git a/src/more_ops.ts b/src/more_ops.ts index 0f6391f..45af3c3 100644 --- a/src/more_ops.ts +++ b/src/more_ops.ts @@ -41,12 +41,11 @@ import { } from "./costs"; import {Bytes, Stream, t, Tuple} from "./__type_compatibility__"; import {EvalError} from "./EvalError"; -import {int, str} from "./__python_types__"; import {int_from_bytes, limbs_for_int} from "./casts"; import {isAtom} from "./CLVMObject"; import {G1Element_add, G1Element_from_bytes, getBLSModule} from "./__bls_signatures__"; -export function malloc_cost(cost: int, atom: SExp){ +export function malloc_cost(cost: number, atom: SExp){ if(!atom.atom){ throw new EvalError("atom is None", atom); } @@ -71,7 +70,7 @@ export function op_sha256(args: SExp){ return malloc_cost(cost, SExp.to(Bytes.from(h.finalize().toUint8Array()))); } -export function* args_as_ints(op_name: str, args: SExp){ +export function* args_as_ints(op_name: string, args: SExp){ for(const arg of args.as_iter()){ if(arg.pair || !arg.atom){ throw new EvalError(`${op_name} requires int args`, arg); @@ -80,7 +79,7 @@ export function* args_as_ints(op_name: str, args: SExp){ } } -export function* args_as_int32(op_name: str, args: SExp){ +export function* args_as_int32(op_name: string, args: SExp){ for(const arg of args.as_iter()){ if(arg.pair || !arg.atom){ throw new EvalError(`${op_name} requires int32 args`, arg); @@ -92,7 +91,7 @@ export function* args_as_int32(op_name: str, args: SExp){ } } -export function args_as_int_list(op_name: str, args: SExp, count: int){ +export function args_as_int_list(op_name: string, args: SExp, count: number){ const int_list: Array> = []; for(const _ of args_as_ints(op_name, args)) int_list.push(_); @@ -103,7 +102,7 @@ export function args_as_int_list(op_name: str, args: SExp, count: int){ return int_list; } -export function* args_as_bools(op_name: str, args: SExp){ +export function* args_as_bools(op_name: string, args: SExp){ for(const arg of args.as_iter()){ const v = arg.atom; if(v?.equal_to(Bytes.NULL)){ @@ -115,7 +114,7 @@ export function* args_as_bools(op_name: str, args: SExp){ } } -export function args_as_bool_list(op_name: str, args: SExp, count: int){ +export function args_as_bool_list(op_name: string, args: SExp, count: number){ const bool_list: SExp[] = []; for(const _ of args_as_bools(op_name, args)) bool_list.push(_); @@ -369,7 +368,7 @@ export function op_lsh(args: SExp){ } // eslint-disable-next-line @typescript-eslint/ban-types -export function binop_reduction(op_name: str, initial_value: number, args: SExp, op_f: Function){ +export function binop_reduction(op_name: string, initial_value: number, args: SExp, op_f: Function){ let total = initial_value; let arg_size = 0; let cost = LOG_BASE_COST; @@ -384,7 +383,7 @@ export function binop_reduction(op_name: str, initial_value: number, args: SExp, } export function op_logand(args: SExp){ - const binop = (a: int, b: int) => { + const binop = (a: number, b: number) => { a &= b; return a; } @@ -393,7 +392,7 @@ export function op_logand(args: SExp){ } export function op_logior(args: SExp){ - const binop = (a: int, b: int) => { + const binop = (a: number, b: number) => { a |= b; return a; } @@ -402,7 +401,7 @@ export function op_logior(args: SExp){ } export function op_logxor(args: SExp){ - const binop = (a: int, b: int) => { + const binop = (a: number, b: number) => { a ^= b; return a; } diff --git a/src/op_utils.ts b/src/op_utils.ts index 36a175c..9fed9e2 100644 --- a/src/op_utils.ts +++ b/src/op_utils.ts @@ -1,12 +1,11 @@ -import {str} from "./__python_types__"; import {SExp} from "./SExp"; export function operators_for_dict( - keyword_to_atom: Record, - op_dict: Record, - op_name_lookup: Record, + keyword_to_atom: Record, + op_dict: Record, + op_name_lookup: Record, ){ - const d: Record unknown> = {}; + const d: Record unknown> = {}; for(const op of Object.keys(keyword_to_atom)){ const op_name = `op_${op_name_lookup[op] || op}`; const op_f = op_dict[op_name] as (args: SExp) => unknown; @@ -18,9 +17,9 @@ export function operators_for_dict( } export function operators_for_module( - keyword_to_atom: Record, - mod: Record, - op_name_lookup: Record = {}, + keyword_to_atom: Record, + mod: Record, + op_name_lookup: Record = {}, ){ return operators_for_dict(keyword_to_atom, mod, op_name_lookup); } \ No newline at end of file diff --git a/src/operators.ts b/src/operators.ts index b6e181c..f17d0dd 100644 --- a/src/operators.ts +++ b/src/operators.ts @@ -1,4 +1,3 @@ -import {int, str} from "./__python_types__"; import {int_from_bytes} from "./casts"; import {SExp} from "./SExp"; import {Bytes, Tuple, t, isBytes} from "./__type_compatibility__"; @@ -45,13 +44,13 @@ export const KEYWORDS = [ ].join("").trim().split(/\s/); export const KEYWORD_FROM_ATOM = Object .entries(KEYWORDS) - .reduce>((acc, v) => { + .reduce>((acc, v) => { acc[int_to_bytes(+v[0]).toString()] = v[1]; return acc; }, {}); export const KEYWORD_TO_ATOM = Object .entries(KEYWORD_FROM_ATOM) - .reduce>((acc, v) => { + .reduce>((acc, v) => { acc[v[1]] = v[0]; return acc; }, {}); @@ -167,7 +166,7 @@ export const OP_REWRITE = { export type ATOMS = keyof typeof KEYWORD_FROM_ATOM; export type KEYWORDS = keyof typeof KEYWORD_TO_ATOM; -export function* args_len(op_name: str, args: SExp){ +export function* args_len(op_name: string, args: SExp){ for(const arg of args.as_iter()){ if(arg.pair){ throw new EvalError(`${op_name} requires int args"`, arg); @@ -204,7 +203,7 @@ export function* args_len(op_name: str, args: SExp){ # this means that unknown ops where cost_function is 1, 2, or 3, may still be # fatal errors if the arguments passed are not atoms. */ -export function default_unknown_op(op: Bytes, args: SExp): Tuple { +export function default_unknown_op(op: Bytes, args: SExp): Tuple { // # any opcode starting with ffff is reserved (i.e. fatal error) // # opcodes are not allowed to be empty if(op.length === 0 || op.slice(0, 2).equal_to(Bytes.from("0xffff", "hex"))){ @@ -288,7 +287,7 @@ export const APPLY_ATOM = Bytes.from(KEYWORD_TO_ATOM["a"], "hex"); type TOpFunc = (args: SExp) => R; type TBasicAtom = "quote_atom"|"apply_atom"; -type TAtomOpFunctionMap = Record & Partial>; +type TAtomOpFunctionMap = Record & Partial>; function merge(obj1: Record, obj2: Record){ Object.keys(obj2).forEach(key => { @@ -296,10 +295,10 @@ function merge(obj1: Record, obj2: Record){ }); } -export type TOperatorDict = { +export type TOperatorDict = { unknown_op_handler: typeof default_unknown_op; } -& ((op: Bytes|string|number, args: SExp) => Tuple) +& ((op: Bytes|string|number, args: SExp) => Tuple) & TAtomOpFunctionMap & Record ; @@ -310,7 +309,7 @@ export type TOperatorDictOption = { unknown_op_handler: typeof default_unknown_op; }; -export function OperatorDict( +export function OperatorDict( atom_op_function_map: TAtomOpFunctionMap|TOperatorDict, option: Partial = {}, ): TOperatorDict { diff --git a/src/run_program.ts b/src/run_program.ts index 5607636..d0395e1 100644 --- a/src/run_program.ts +++ b/src/run_program.ts @@ -1,4 +1,4 @@ -import {int, None, uint8} from "./__python_types__"; +import {None} from "./__python_types__"; import {SExp} from "./SExp"; import {TToSexpF} from "./as_javascript"; import {CLVMObject, isAtom, isCons} from "./CLVMObject"; @@ -13,7 +13,7 @@ import { import {EvalError} from "./EvalError"; import {TOperatorDict} from "./operators"; -export type OpCallable = (opStack: OpStackType, valStack: ValStackType) => int; +export type OpCallable = (opStack: OpStackType, valStack: ValStackType) => number; export type ValStackType = SExp[]; export type OpStackType = OpCallable[]; export type TPreEvalF = (v1: SExp, v2: SExp) => unknown; @@ -33,7 +33,7 @@ export function to_pre_eval_op(pre_eval_f: TPreEvalF, to_sexp_f: TToSexpF){ }; } -export function msb_mask(byte: uint8){ +export function msb_mask(byte: number){ byte |= byte >> 1; byte |= byte >> 2; byte |= byte >> 4; @@ -46,11 +46,11 @@ export function run_program( operator_lookup: TOperatorDict, max_cost: number|None = None, pre_eval_f: TPreEvalF|None = None, -): Tuple{ +): Tuple{ program = SExp.to(program); const pre_eval_op = pre_eval_f ? to_pre_eval_op(pre_eval_f, SExp.to) : None; - function traverse_path(sexp: SExp, env: SExp): Tuple { + function traverse_path(sexp: SExp, env: SExp): Tuple { let cost = PATH_LOOKUP_BASE_COST; cost += PATH_LOOKUP_COST_PER_LEG; if(sexp.nullp()){ @@ -95,7 +95,7 @@ export function run_program( return t(cost, env); } - function swap_op(op_stack: OpStackType, value_stack: ValStackType): int { + function swap_op(op_stack: OpStackType, value_stack: ValStackType): number { const v2 = value_stack.pop() as SExp; const v1 = value_stack.pop() as SExp; value_stack.push(v2); @@ -103,14 +103,14 @@ export function run_program( return 0; } - function cons_op (op_stack: OpStackType, value_stack: ValStackType): int { + function cons_op (op_stack: OpStackType, value_stack: ValStackType): number { const v1 = value_stack.pop() as SExp; const v2 = value_stack.pop() as SExp; value_stack.push(v1.cons(v2)); return 0; } - function eval_op(op_stack: OpStackType, value_stack: ValStackType): int { + function eval_op(op_stack: OpStackType, value_stack: ValStackType): number { if(pre_eval_op){ pre_eval_op(op_stack, value_stack); } @@ -122,7 +122,7 @@ export function run_program( // # put a bunch of ops on op_stack if(!isCons(sexp)){ // # sexp is an atom - const [cost, r] = traverse_path(sexp, args) as [int, SExp]; + const [cost, r] = traverse_path(sexp, args) as [number, SExp]; value_stack.push(r); return cost; } @@ -162,7 +162,7 @@ export function run_program( return 1; } - function apply_op(op_stack: OpStackType, value_stack: ValStackType): int { + function apply_op(op_stack: OpStackType, value_stack: ValStackType): number { const operand_list = value_stack.pop() as SExp; const operator = value_stack.pop() as SExp; if(!isAtom(operator)){ @@ -182,7 +182,7 @@ export function run_program( return APPLY_COST; } - const [additional_cost, r] = operator_lookup(op, operand_list) as [int, CLVMObject]; + const [additional_cost, r] = operator_lookup(op, operand_list) as [number, CLVMObject]; value_stack.push(r as SExp); return additional_cost; } From 976dbc123d4fe712e05d99f836a7d8091043a283 Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 16:51:05 +0900 Subject: [PATCH 11/16] Updated test --- tests/as_javascript_test.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/as_javascript_test.ts b/tests/as_javascript_test.ts index c0d409e..6f85ef0 100644 --- a/tests/as_javascript_test.ts +++ b/tests/as_javascript_test.ts @@ -1,4 +1,4 @@ -import {SExp, t, h, b, Bytes, getBLSModule, initialize, None, Tuple, list} from "../src"; +import {SExp, t, h, b, Bytes, getBLSModule, initialize, None, Tuple, list, str, repr} from "../src"; import {CLVMObject} from "../src/CLVMObject"; import {EvalError} from "../src/EvalError"; import type {ModuleInstance} from "@chiamine/bls-signatures"; @@ -287,17 +287,17 @@ test("test_eq_tree", () => { }); test("test_str", () => { - expect(SExp.to(1).toString()).toBe("01"); - expect(SExp.to(1337).toString()).toBe("820539"); - expect(SExp.to(-1).toString()).toBe("81ff"); - expect(SExp.to(gen_tree(1)).toString()).toBe("ff820539820539"); - expect(SExp.to(gen_tree(2)).toString()).toBe("ffff820539820539ff820539820539"); + expect(str(SExp.to(1))).toBe("01"); + expect(str(SExp.to(1337))).toBe("820539"); + expect(str(SExp.to(-1))).toBe("81ff"); + expect(str(SExp.to(gen_tree(1)))).toBe("ff820539820539"); + expect(str(SExp.to(gen_tree(2)))).toBe("ffff820539820539ff820539820539"); }); test("test_repr", () => { - expect(SExp.to(1).__repr__()).toBe("SExp(01)"); - expect(SExp.to(1337).__repr__()).toBe("SExp(820539)"); - expect(SExp.to(-1).__repr__()).toBe("SExp(81ff)"); - expect(SExp.to(gen_tree(1)).__repr__()).toBe("SExp(ff820539820539)"); - expect(SExp.to(gen_tree(2)).__repr__()).toBe("SExp(ffff820539820539ff820539820539)"); + expect(repr(SExp.to(1))).toBe("SExp(01)"); + expect(repr(SExp.to(1337))).toBe("SExp(820539)"); + expect(repr(SExp.to(-1))).toBe("SExp(81ff)"); + expect(repr(SExp.to(gen_tree(1)))).toBe("SExp(ff820539820539)"); + expect(repr(SExp.to(gen_tree(2)))).toBe("SExp(ffff820539820539ff820539820539)"); }); From eb4b9ab0aeea199076513961fc90bdeb1788b7f1 Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 20:20:25 +0900 Subject: [PATCH 12/16] Added `Bytes::subarray` to get bytes data without additional memory allocation/copy --- CHANGELOG.md | 3 ++- README.md | 5 +++-- src/__type_compatibility__.ts | 17 +++++++++++++---- src/more_ops.ts | 2 +- src/operators.ts | 4 ++-- src/serialize.ts | 2 +- tests/serialize_test.ts | 6 +++--- 7 files changed, 25 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7454e2..1b79e46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,10 @@ ### Added - Added GitHub Action - Added `str()`, `repr()` utility functions. +- Added `Bytes::subarray` to get bytes data without additional memory allocation/copy. ### Changed - Updated README.md -- Changed method name `Bytes::get_byte_at` to `Bytes::at` (Breaking change) +- Changed method name `Bytes::get_byte_at` to `Bytes::at` (Breaking change). ### Deprecated - Deprecated python specific type definition such as `str`, `int`. Use `string`, `number` instead. diff --git a/README.md b/README.md index a2b0816..8edb14f 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ b("あ"); // will be { Uint8Array(3) [227,129,130] } // If you want to do Byte comparison, use equal_to method. b("abc").equal_to(b("abc")); // true -b("abc") === b("abc"); // false. Because it is just an instance of a Bytes class and not immutable. +b("abc") === b("abc"); // false. Because it compares reference of Bytes instance. // Initialize Bytes instance with hex string const {h} = require("clvm"); @@ -138,9 +138,10 @@ b2.at(0); // 0 ### Python's `str(x)` is `x.toString()` in Javascript If you want to stringify `SExp` or `Bytes`, just call `x.toString()` method. ```javascript -const {b, SExp} = require("clvm"); +const {b, SExp, str} = require("clvm"); b("あ").toString(); // "b'\\xe3\\x81\\x82'" SExp.to([1, [2, 3]]).toString(); // 'ff01ffff02ff038080' +str(SExp.to([1, [2, 3]])); // You can use str() function as well as Python by the way. ``` ## clvm license diff --git a/src/__type_compatibility__.ts b/src/__type_compatibility__.ts index 92de941..19e6f95 100644 --- a/src/__type_compatibility__.ts +++ b/src/__type_compatibility__.ts @@ -168,7 +168,14 @@ export class Bytes { public slice(start: number, length?: number){ const len = typeof length === "number" ? length : (this.length - start); - return new Bytes(this._b.slice(start, start+len)); + const ui8_clone = this._b.slice(start, start+len); + return new Bytes(ui8_clone); + } + + public subarray(start: number, length?: number){ + const len = typeof length === "number" ? length : (this.length - start); + const ui8_raw = this._b.subarray(start, start+len); + return new Bytes(ui8_raw); } public as_word(){ @@ -231,8 +238,10 @@ export class Bytes { if(this.length !== other.length){ return this.length > other.length ? 1 : -1; } - const dv_self = new DataView(this.raw().buffer); - const dv_other = new DataView(other.raw().buffer); + const self_raw_byte = this._b; + const dv_self = new DataView(self_raw_byte.buffer, self_raw_byte.byteOffset, self_raw_byte.byteLength); + const other_raw_byte = other.raw(); + const dv_other = new DataView(other_raw_byte.buffer, other_raw_byte.byteOffset, other_raw_byte.byteLength); const ui32MaxCount = (this.length / 4) | 0; for(let i=0;i { // # any opcode starting with ffff is reserved (i.e. fatal error) // # opcodes are not allowed to be empty - if(op.length === 0 || op.slice(0, 2).equal_to(Bytes.from("0xffff", "hex"))){ + if(op.length === 0 || op.subarray(0, 2).equal_to(Bytes.from("0xffff", "hex"))){ throw new EvalError("reserved operator", SExp.to(op)); } @@ -222,7 +222,7 @@ export function default_unknown_op(op: Bytes, args: SExp): Tuple 0 && this._buf.length > 0){ - ret = ret.concat(this._buf.slice(0,1)); - this._buf = this._buf.slice(1); + ret = ret.concat(this._buf.subarray(0,1)); + this._buf = this._buf.subarray(1); n -= 1; } ret = ret.concat(b(" ").repeat(n)); @@ -85,7 +85,7 @@ test("test_long_blobs", () =>{ text = text.repeat(300); for(let _=0;_ Date: Sun, 1 Aug 2021 20:21:28 +0900 Subject: [PATCH 13/16] Remove blank line --- tests/serialize_test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/serialize_test.ts b/tests/serialize_test.ts index fbac23f..0c327b8 100644 --- a/tests/serialize_test.ts +++ b/tests/serialize_test.ts @@ -108,7 +108,6 @@ test("test_very_long_blobs", () => { expect(text.length).toBeGreaterThan(size); check_serde(text); } - }); test("test_very_deep_tree", () => { From dcb3154e3d0949ff0d121757d9b0d8be0dc6db62 Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 20:53:48 +0900 Subject: [PATCH 14/16] Updated CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b79e46..d4130ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Changelog ## [1.0.0] +This version is compatible with [`1a5cb17895d8707f784a85180bc97d3c6ebe71a0`](https://github.com/Chia-Network/clvm/tree/1a5cb17895d8707f784a85180bc97d3c6ebe71a0) of [clvm@0.9.7](https://github.com/Chia-Network/clvm) + ### Removed - Removed `.dist` folder from git. - This folder made it harder to check diffs between versions. From dcb1f647a4cfa4b839adcd4f0884ee814d536e3f Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 21:38:12 +0900 Subject: [PATCH 15/16] Set version to 1.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aff808a..8b94e40 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clvm", - "version": "0.0.19", + "version": "1.0.0", "author": "Admin ChiaMineJP ", "description": "Javascript implementation of chia lisp", "license": "MIT", From b2086b9ffe7ff01ffff030efde7c17d0c4f18bb2 Mon Sep 17 00:00:00 2001 From: ChiaMineJP Date: Sun, 1 Aug 2021 21:56:39 +0900 Subject: [PATCH 16/16] Updated GitHub Workflow trigger --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 95a1344..9053287 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,12 +3,12 @@ name: Test on: push: branches: - - '*' - - '!master' + - main + tags: + - '**' pull_request: branches: - - '*' - - '!master' + - '**' jobs: build: