From 4a9afa04688ab2d01e9e1732619aa63754749d99 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:54:22 +0400 Subject: [PATCH 01/26] remove check.ts --- src/check.ts | 110 --------------------------------------------------- src/main.ts | 1 - 2 files changed, 111 deletions(-) delete mode 100644 src/check.ts diff --git a/src/check.ts b/src/check.ts deleted file mode 100644 index ce5a19253..000000000 --- a/src/check.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { featureEnable } from "./config/features"; -import { CompilerContext } from "./context"; -import { getAstFactory } from "./grammar/ast"; -import { getParser } from "./grammar"; -import files from "./imports/stdlib"; -import { createVirtualFileSystem, TactError, VirtualFileSystem } from "./main"; -import { precompile } from "./pipeline/precompile"; -import { defaultParser } from "./grammar/grammar"; - -export type CheckResultItem = { - type: "error" | "warning"; - message: string; - location?: { - file: string; - line: number; - column: number; - length: number; - }; -}; - -export type CheckResult = - | { - ok: true; - } - | { - ok: false; - messages: CheckResultItem[]; - }; - -export function check(args: { - project: VirtualFileSystem; - entrypoint: string; -}): CheckResult { - // Create context - const stdlib = createVirtualFileSystem("@stdlib/", files); - let ctx: CompilerContext = new CompilerContext(); - ctx = featureEnable(ctx, "debug"); // Enable debug flag (does not affect type checking in practice) - ctx = featureEnable(ctx, "external"); // Enable external messages flag to avoid external-specific errors - - const ast = getAstFactory(); - const parser = getParser(ast, defaultParser); - - // Execute check - const items: CheckResultItem[] = []; - try { - precompile(ctx, args.project, stdlib, args.entrypoint, parser, ast); - } catch (e) { - if (e instanceof TactError) { - items.push({ - type: "error", - message: e.message, - location: - e.loc === undefined - ? undefined - : e.loc.file - ? { - file: e.loc.file, - line: e.loc.interval.getLineAndColumn().lineNum, - column: e.loc.interval.getLineAndColumn() - .colNum, - length: - e.loc.interval.endIdx - - e.loc.interval.startIdx, - } - : { - file: args.entrypoint, - line: 0, - column: 0, - length: 0, - }, - }); - } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const msg = (e as any).message; - if (typeof msg === "string") { - items.push({ - type: "error", - message: msg, - location: { - file: args.entrypoint, - line: 0, - column: 0, - length: 0, - }, - }); - } else { - items.push({ - type: "error", - message: "Unknown internal message", - location: { - file: args.entrypoint, - line: 0, - column: 0, - length: 0, - }, - }); - } - } - } - - if (items.length > 0) { - return { - ok: false, - messages: items, - }; - } - return { - ok: true, - }; -} diff --git a/src/main.ts b/src/main.ts index 88816f83d..76cc91a1b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -17,4 +17,3 @@ export * from "./browser"; export * from "./verify"; export * from "./logger"; export * from "./errors"; -export * from "./check"; From 2a52b96e76d77528ee2b96f042f1c2d941a8f083 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:09:02 +0400 Subject: [PATCH 02/26] separate interpeter stage --- CONTRIBUTING.md | 2 +- src/abi/global.ts | 2 +- src/generator/writers/writeExpression.ts | 2 +- src/{ => interpreter}/constEval.ts | 16 ++++++++-------- src/{ => interpreter}/interpreter.ts | 18 +++++++++--------- src/node.ts | 2 +- src/optimizer/associative.ts | 2 +- src/optimizer/test/partial-eval.spec.ts | 4 ++-- src/types/resolveDescriptors.ts | 2 +- src/types/resolveErrors.ts | 2 +- src/types/resolveSignatures.ts | 4 ++-- src/types/resolveStatements.ts | 4 ++-- 12 files changed, 30 insertions(+), 30 deletions(-) rename src/{ => interpreter}/constEval.ts (95%) rename src/{ => interpreter}/interpreter.ts (99%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 257c6cf74..7e6603f76 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -147,7 +147,7 @@ The constant evaluator is used as an optimizer to prevent some statically known The constant evaluator supports a large subset of Tact and handles, for instance, constants defined in terms of other constants, built-in and user-defined functions, logical and arithmetic operations. -The main logic of the constant evaluator can be found in the file [src/interpreter.ts](./src/interpreter.ts). +The main logic of the constant evaluator can be found in the file [src/interpreter.ts](src/interpreter/interpreter.ts). You can find the relevant tests in [src/test/e2e-emulated/contracts/constants.tact](./src/test/e2e-emulated/contracts/constants.tact) and the corresponding spec-file: [](./src/test/e2e-emulated/constants.spec.ts). diff --git a/src/abi/global.ts b/src/abi/global.ts index 87ef019df..aa96cb315 100644 --- a/src/abi/global.ts +++ b/src/abi/global.ts @@ -10,7 +10,7 @@ import { writeValue, } from "../generator/writers/writeExpression"; import { TactConstEvalError, throwCompilationError } from "../errors"; -import { evalConstantExpression } from "../constEval"; +import { evalConstantExpression } from "../interpreter/constEval"; import { getErrorId } from "../types/resolveErrors"; import { AbiFunction } from "./AbiFunction"; import { sha256_sync } from "@ton/crypto"; diff --git a/src/generator/writers/writeExpression.ts b/src/generator/writers/writeExpression.ts index 398eba4c4..eb74863e1 100644 --- a/src/generator/writers/writeExpression.ts +++ b/src/generator/writers/writeExpression.ts @@ -41,7 +41,7 @@ import { } from "./writeConstant"; import { ops } from "./ops"; import { writeCastedExpression } from "./writeFunction"; -import { evalConstantExpression } from "../../constEval"; +import { evalConstantExpression } from "../../interpreter/constEval"; import { isLvalue } from "../../types/resolveStatements"; function isNull(wCtx: WriterContext, expr: AstExpression): boolean { diff --git a/src/constEval.ts b/src/interpreter/constEval.ts similarity index 95% rename from src/constEval.ts rename to src/interpreter/constEval.ts index 630c901a7..d7946c4b4 100644 --- a/src/constEval.ts +++ b/src/interpreter/constEval.ts @@ -1,16 +1,16 @@ -import { CompilerContext } from "./context"; +import { CompilerContext } from "../context"; import { AstBinaryOperation, AstExpression, AstUnaryOperation, AstValue, isValue, -} from "./grammar/ast"; -import { TactConstEvalError } from "./errors"; -import { Value } from "./types/types"; -import { AstUtil, extractValue } from "./optimizer/util"; -import { ExpressionTransformer } from "./optimizer/types"; -import { StandardOptimizer } from "./optimizer/standardOptimizer"; +} from "../grammar/ast"; +import { TactConstEvalError } from "../errors"; +import { Value } from "../types/types"; +import { AstUtil, extractValue } from "../optimizer/util"; +import { ExpressionTransformer } from "../optimizer/types"; +import { StandardOptimizer } from "../optimizer/standardOptimizer"; import { Interpreter, InterpreterConfig, @@ -19,7 +19,7 @@ import { evalUnaryOp, throwNonFatalErrorConstEval, } from "./interpreter"; -import { SrcInfo } from "./grammar"; +import { SrcInfo } from "../grammar"; // Utility Exception class to interrupt the execution // of functions that cannot evaluate a tree fully into a value. diff --git a/src/interpreter.ts b/src/interpreter/interpreter.ts similarity index 99% rename from src/interpreter.ts rename to src/interpreter/interpreter.ts index be27bee88..d99660394 100644 --- a/src/interpreter.ts +++ b/src/interpreter/interpreter.ts @@ -2,14 +2,14 @@ import { Address, beginCell, BitString, Cell, Slice, toNano } from "@ton/core"; import { paddedBufferToBits } from "@ton/core/dist/boc/utils/paddedBits"; import * as crc32 from "crc-32"; import { evalConstantExpression } from "./constEval"; -import { CompilerContext } from "./context"; +import { CompilerContext } from "../context"; import { TactCompilationError, TactConstEvalError, idTextErr, throwConstEvalError, throwInternalCompilerError, -} from "./errors"; +} from "../errors"; import { AstBinaryOperation, AstBoolean, @@ -55,26 +55,26 @@ import { getAstFactory, idText, isSelfId, -} from "./grammar/ast"; -import { SrcInfo, dummySrcInfo, Parser, getParser } from "./grammar"; -import { divFloor, modFloor } from "./optimizer/util"; +} from "../grammar/ast"; +import { SrcInfo, dummySrcInfo, Parser, getParser } from "../grammar"; +import { divFloor, modFloor } from "../optimizer/util"; import { getStaticConstant, getStaticFunction, getType, hasStaticConstant, hasStaticFunction, -} from "./types/resolveDescriptors"; -import { getExpType } from "./types/resolveExpression"; +} from "../types/resolveDescriptors"; +import { getExpType } from "../types/resolveExpression"; import { CommentValue, StructValue, TypeRef, Value, showValue, -} from "./types/types"; +} from "../types/types"; import { sha256_sync } from "@ton/crypto"; -import { defaultParser } from "./grammar/grammar"; +import { defaultParser } from "../grammar/grammar"; // TVM integers are signed 257-bit integers const minTvmInt: bigint = -(2n ** 256n); diff --git a/src/node.ts b/src/node.ts index 170330913..a34676dbe 100644 --- a/src/node.ts +++ b/src/node.ts @@ -143,4 +143,4 @@ export async function run(args: { export { createNodeFileSystem } from "./vfs/createNodeFileSystem"; -export { parseAndEvalExpression } from "./interpreter"; +export { parseAndEvalExpression } from "./interpreter/interpreter"; diff --git a/src/optimizer/associative.ts b/src/optimizer/associative.ts index bdb26e4d9..55491e009 100644 --- a/src/optimizer/associative.ts +++ b/src/optimizer/associative.ts @@ -7,7 +7,7 @@ import { AstValue, isValue, } from "../grammar/ast"; -import * as interpreterModule from "../interpreter"; +import * as interpreterModule from "../interpreter/interpreter"; import { Value } from "../types/types"; import { ExpressionTransformer, Rule } from "./types"; import { diff --git a/src/optimizer/test/partial-eval.spec.ts b/src/optimizer/test/partial-eval.spec.ts index 8a23f4f0a..682ca5d43 100644 --- a/src/optimizer/test/partial-eval.spec.ts +++ b/src/optimizer/test/partial-eval.spec.ts @@ -7,11 +7,11 @@ import { isValue, } from "../../grammar/ast"; import { AstUtil, extractValue, getAstUtil } from "../util"; -import { getOptimizer } from "../../constEval"; +import { getOptimizer } from "../../interpreter/constEval"; import { CompilerContext } from "../../context"; import { ExpressionTransformer, Rule } from "../types"; import { AssociativeRule3 } from "../associative"; -import { evalBinaryOp, evalUnaryOp } from "../../interpreter"; +import { evalBinaryOp, evalUnaryOp } from "../../interpreter/interpreter"; import { getParser } from "../../grammar"; import { defaultParser } from "../../grammar/grammar"; diff --git a/src/types/resolveDescriptors.ts b/src/types/resolveDescriptors.ts index 2f01f4c9e..428e8afd8 100644 --- a/src/types/resolveDescriptors.ts +++ b/src/types/resolveDescriptors.ts @@ -44,7 +44,7 @@ import { getRawAST } from "../grammar/store"; import { cloneNode } from "../grammar/clone"; import { crc16 } from "../utils/crc16"; import { isSubsetOf } from "../utils/isSubsetOf"; -import { evalConstantExpression } from "../constEval"; +import { evalConstantExpression } from "../interpreter/constEval"; import { resolveABIType, intMapKeyFormats, diff --git a/src/types/resolveErrors.ts b/src/types/resolveErrors.ts index 29e3e00d3..31f8835a5 100644 --- a/src/types/resolveErrors.ts +++ b/src/types/resolveErrors.ts @@ -2,7 +2,7 @@ import { sha256_sync } from "@ton/crypto"; import { CompilerContext, createContextStore } from "../context"; import { AstNode, isRequire } from "../grammar/ast"; import { traverse } from "../grammar/iterators"; -import { evalConstantExpression } from "../constEval"; +import { evalConstantExpression } from "../interpreter/constEval"; import { throwInternalCompilerError } from "../errors"; import { getAllStaticFunctions, diff --git a/src/types/resolveSignatures.ts b/src/types/resolveSignatures.ts index e940bfe47..0060e46c9 100644 --- a/src/types/resolveSignatures.ts +++ b/src/types/resolveSignatures.ts @@ -18,8 +18,8 @@ import { AstNumber, AstReceiver } from "../grammar/ast"; import { commentPseudoOpcode } from "../generator/writers/writeRouter"; import { sha256_sync } from "@ton/crypto"; import { dummySrcInfo } from "../grammar"; -import { ensureInt } from "../interpreter"; -import { evalConstantExpression } from "../constEval"; +import { ensureInt } from "../interpreter/interpreter"; +import { evalConstantExpression } from "../interpreter/constEval"; export function resolveSignatures(ctx: CompilerContext) { const signatures: Map< diff --git a/src/types/resolveStatements.ts b/src/types/resolveStatements.ts index e5ca22bbf..42bfb03ee 100644 --- a/src/types/resolveStatements.ts +++ b/src/types/resolveStatements.ts @@ -27,8 +27,8 @@ import { } from "./resolveDescriptors"; import { getExpType, resolveExpression } from "./resolveExpression"; import { FunctionDescription, printTypeRef, TypeRef } from "./types"; -import { evalConstantExpression } from "../constEval"; -import { ensureInt } from "../interpreter"; +import { evalConstantExpression } from "../interpreter/constEval"; +import { ensureInt } from "../interpreter/interpreter"; import { crc16 } from "../utils/crc16"; import { SrcInfo } from "../grammar"; From 7605be5d009263a112cea8fc7dfe5248389dc166 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:18:15 +0400 Subject: [PATCH 03/26] move errors.ts --- src/abi/global.ts | 2 +- src/abi/map.ts | 2 +- src/abi/struct.ts | 2 +- src/bindings/typescript/serializers.ts | 2 +- src/bindings/typescript/writeStruct.ts | 2 +- src/bindings/writeTypescript.ts | 2 +- src/error/display-to-json.ts | 2 +- src/error/display-to-string.ts | 2 +- src/{ => error}/errors.ts | 4 ++-- src/generator/writers/writeExpression.ts | 2 +- src/generator/writers/writeFunction.ts | 2 +- src/generator/writers/writeSerialization.ts | 2 +- src/grammar/clone.ts | 2 +- src/grammar/compare.ts | 2 +- src/grammar/hash.ts | 2 +- src/grammar/next/index.ts | 2 +- src/grammar/prev/grammar.ts | 2 +- src/grammar/prev/parser-error.ts | 2 +- src/grammar/sort.ts | 2 +- src/grammar/src-info.ts | 2 +- src/grammar/store.ts | 2 +- src/imports/resolveImports.ts | 2 +- src/index.ts | 2 +- src/interpreter/constEval.ts | 2 +- src/interpreter/interpreter.ts | 2 +- src/main.ts | 2 +- src/node.ts | 2 +- src/optimizer/util.ts | 2 +- src/pipeline/build.ts | 2 +- src/storage/allocator.ts | 2 +- src/storage/resolveAllocation.ts | 2 +- src/types/resolveABITypeRef.ts | 2 +- src/types/resolveDescriptors.ts | 2 +- src/types/resolveErrors.ts | 2 +- src/types/resolveExpression.ts | 4 ++-- src/types/resolveSignatures.ts | 4 ++-- src/types/resolveStatements.ts | 2 +- src/types/types.ts | 2 +- src/utils/tricks.ts | 2 +- src/utils/utils.ts | 2 +- 40 files changed, 43 insertions(+), 43 deletions(-) rename src/{ => error}/errors.ts (96%) diff --git a/src/abi/global.ts b/src/abi/global.ts index aa96cb315..015dbd851 100644 --- a/src/abi/global.ts +++ b/src/abi/global.ts @@ -9,7 +9,7 @@ import { writeExpression, writeValue, } from "../generator/writers/writeExpression"; -import { TactConstEvalError, throwCompilationError } from "../errors"; +import { TactConstEvalError, throwCompilationError } from "../error/errors"; import { evalConstantExpression } from "../interpreter/constEval"; import { getErrorId } from "../types/resolveErrors"; import { AbiFunction } from "./AbiFunction"; diff --git a/src/abi/map.ts b/src/abi/map.ts index d2c52c783..f17d5cb90 100644 --- a/src/abi/map.ts +++ b/src/abi/map.ts @@ -4,7 +4,7 @@ import { TypeRef } from "../types/types"; import { WriterContext } from "../generator/Writer"; import { ops } from "../generator/writers/ops"; import { writeExpression } from "../generator/writers/writeExpression"; -import { throwCompilationError } from "../errors"; +import { throwCompilationError } from "../error/errors"; import { getType } from "../types/resolveDescriptors"; import { AbiFunction } from "./AbiFunction"; import { AstExpression } from "../grammar/ast"; diff --git a/src/abi/struct.ts b/src/abi/struct.ts index 48a24a135..541dba8ac 100644 --- a/src/abi/struct.ts +++ b/src/abi/struct.ts @@ -1,6 +1,6 @@ import { ops } from "../generator/writers/ops"; import { writeExpression } from "../generator/writers/writeExpression"; -import { throwCompilationError } from "../errors"; +import { throwCompilationError } from "../error/errors"; import { getType } from "../types/resolveDescriptors"; import { AbiFunction } from "./AbiFunction"; diff --git a/src/bindings/typescript/serializers.ts b/src/bindings/typescript/serializers.ts index 268ae6474..ab8bbf3b5 100644 --- a/src/bindings/typescript/serializers.ts +++ b/src/bindings/typescript/serializers.ts @@ -1,6 +1,6 @@ import { ABITypeRef } from "@ton/core"; import { Writer } from "../../utils/Writer"; -import { throwInternalCompilerError } from "../../errors"; +import { throwInternalCompilerError } from "../../error/errors"; const primitiveTypes = [ "int", diff --git a/src/bindings/typescript/writeStruct.ts b/src/bindings/typescript/writeStruct.ts index 477b534e7..5c7f2c766 100644 --- a/src/bindings/typescript/writeStruct.ts +++ b/src/bindings/typescript/writeStruct.ts @@ -1,7 +1,7 @@ import { ABIType, ABITypeRef } from "@ton/core"; import { serializers } from "./serializers"; import { AllocationCell, AllocationOperation } from "../../storage/operation"; -import { throwInternalCompilerError } from "../../errors"; +import { throwInternalCompilerError } from "../../error/errors"; import { Writer } from "../../utils/Writer"; export const maxTupleSize = 15; diff --git a/src/bindings/writeTypescript.ts b/src/bindings/writeTypescript.ts index b179f9bf0..cdd5668ca 100644 --- a/src/bindings/writeTypescript.ts +++ b/src/bindings/writeTypescript.ts @@ -14,7 +14,7 @@ import { writeTupleSerializer, } from "./typescript/writeStruct"; import { AllocationCell } from "../storage/operation"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; import { topologicalSort } from "../utils/utils"; import { allocate, diff --git a/src/error/display-to-json.ts b/src/error/display-to-json.ts index 6c7e55daa..65138c2da 100644 --- a/src/error/display-to-json.ts +++ b/src/error/display-to-json.ts @@ -2,7 +2,7 @@ * Render error message to JSON for tests */ -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "./errors"; import { SrcInfo } from "../grammar"; import { srcInfoEqual } from "../grammar/src-info"; import { ErrorDisplay } from "./display"; diff --git a/src/error/display-to-string.ts b/src/error/display-to-string.ts index e93d1a06a..f0d406cb7 100644 --- a/src/error/display-to-string.ts +++ b/src/error/display-to-string.ts @@ -3,7 +3,7 @@ */ import { ErrorDisplay } from "./display"; -import { locationStr } from "../errors"; +import { locationStr } from "./errors"; export const displayToString: ErrorDisplay = { text: (text) => text, diff --git a/src/errors.ts b/src/error/errors.ts similarity index 96% rename from src/errors.ts rename to src/error/errors.ts index 0b2cac041..f12c0b4c8 100644 --- a/src/errors.ts +++ b/src/error/errors.ts @@ -1,7 +1,7 @@ import path from "path"; import { cwd } from "process"; -import { AstFuncId, AstId, AstTypeId } from "./grammar/ast"; -import { SrcInfo } from "./grammar"; +import { AstFuncId, AstId, AstTypeId } from "../grammar/ast"; +import { SrcInfo } from "../grammar"; export class TactError extends Error { readonly loc?: SrcInfo; diff --git a/src/generator/writers/writeExpression.ts b/src/generator/writers/writeExpression.ts index eb74863e1..f951d7990 100644 --- a/src/generator/writers/writeExpression.ts +++ b/src/generator/writers/writeExpression.ts @@ -9,7 +9,7 @@ import { idTextErr, TactConstEvalError, throwCompilationError, -} from "../../errors"; +} from "../../error/errors"; import { getExpType } from "../../types/resolveExpression"; import { getStaticConstant, diff --git a/src/generator/writers/writeFunction.ts b/src/generator/writers/writeFunction.ts index f897bd258..41143612b 100644 --- a/src/generator/writers/writeFunction.ts +++ b/src/generator/writers/writeFunction.ts @@ -22,7 +22,7 @@ import { cast } from "./cast"; import { resolveFuncTupleType } from "./resolveFuncTupleType"; import { ops } from "./ops"; import { freshIdentifier } from "./freshIdentifier"; -import { idTextErr, throwInternalCompilerError } from "../../errors"; +import { idTextErr, throwInternalCompilerError } from "../../error/errors"; import { ppAsmShuffle } from "../../prettyPrinter"; export function writeCastedExpression( diff --git a/src/generator/writers/writeSerialization.ts b/src/generator/writers/writeSerialization.ts index a9b593a80..592345cea 100644 --- a/src/generator/writers/writeSerialization.ts +++ b/src/generator/writers/writeSerialization.ts @@ -1,5 +1,5 @@ import { contractErrors } from "../../abi/errors"; -import { throwInternalCompilerError } from "../../errors"; +import { throwInternalCompilerError } from "../../error/errors"; import { dummySrcInfo, ItemOrigin } from "../../grammar"; import { AllocationCell, AllocationOperation } from "../../storage/operation"; import { StorageAllocation } from "../../storage/StorageAllocation"; diff --git a/src/grammar/clone.ts b/src/grammar/clone.ts index 48e8a8a79..31b92d1fe 100644 --- a/src/grammar/clone.ts +++ b/src/grammar/clone.ts @@ -1,5 +1,5 @@ import { AstNode, FactoryAst } from "./ast"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; export function cloneNode( src: T, diff --git a/src/grammar/compare.ts b/src/grammar/compare.ts index d744caecc..918d3bd95 100644 --- a/src/grammar/compare.ts +++ b/src/grammar/compare.ts @@ -56,7 +56,7 @@ import { AstStatementDestruct, } from "./ast"; import { AstRenamer } from "./rename"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; import JSONbig from "json-bigint"; /** diff --git a/src/grammar/hash.ts b/src/grammar/hash.ts index a4ac5c616..354f22431 100644 --- a/src/grammar/hash.ts +++ b/src/grammar/hash.ts @@ -26,7 +26,7 @@ import { AstAsmInstruction, } from "./ast"; import { createHash } from "crypto"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; import JSONbig from "json-bigint"; export type AstHash = string; diff --git a/src/grammar/next/index.ts b/src/grammar/next/index.ts index 6a1341c7e..68ac14ee0 100644 --- a/src/grammar/next/index.ts +++ b/src/grammar/next/index.ts @@ -2,7 +2,7 @@ import * as $ from "@tonstudio/parser-runtime"; import * as A from "../ast"; import * as G from "./grammar"; import type { $ast } from "./grammar"; -import { TactCompilationError, throwInternalCompilerError } from "../../errors"; +import { TactCompilationError, throwInternalCompilerError } from "../../error/errors"; import { SyntaxErrors, syntaxErrorSchema } from "../parser-error"; import { AstSchema, getAstSchema } from "../ast-typed"; import { getSrcInfo, ItemOrigin } from "../src-info"; diff --git a/src/grammar/prev/grammar.ts b/src/grammar/prev/grammar.ts index 4964f03ce..4951d5c62 100644 --- a/src/grammar/prev/grammar.ts +++ b/src/grammar/prev/grammar.ts @@ -1,6 +1,6 @@ import { Node, IterationNode, NonterminalNode } from "ohm-js"; import tactGrammar from "./grammar.ohm-bundle"; -import { throwInternalCompilerError } from "../../errors"; +import { throwInternalCompilerError } from "../../error/errors"; import { AstAugmentedAssignOperation, AstConstantAttribute, diff --git a/src/grammar/prev/parser-error.ts b/src/grammar/prev/parser-error.ts index b5cf31015..fd40d493a 100644 --- a/src/grammar/prev/parser-error.ts +++ b/src/grammar/prev/parser-error.ts @@ -1,6 +1,6 @@ import { MatchResult } from "ohm-js"; import { ErrorDisplay } from "../../error/display"; -import { TactCompilationError } from "../../errors"; +import { TactCompilationError } from "../../error/errors"; import { syntaxErrorSchema } from "../parser-error"; import { ItemOrigin, SrcInfo } from "../src-info"; import { getSrcInfoFromOhm } from "./src-info"; diff --git a/src/grammar/sort.ts b/src/grammar/sort.ts index 41af072eb..a924702c6 100644 --- a/src/grammar/sort.ts +++ b/src/grammar/sort.ts @@ -5,7 +5,7 @@ import { AstContractAttribute, AstNode, } from "./ast"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; /** * Provides utilities to sort lists of AST nodes. diff --git a/src/grammar/src-info.ts b/src/grammar/src-info.ts index 296a29d3f..feb3941a2 100644 --- a/src/grammar/src-info.ts +++ b/src/grammar/src-info.ts @@ -1,4 +1,4 @@ -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; export type ItemOrigin = "stdlib" | "user"; diff --git a/src/grammar/store.ts b/src/grammar/store.ts index 651a13e4c..21092e297 100644 --- a/src/grammar/store.ts +++ b/src/grammar/store.ts @@ -6,7 +6,7 @@ import { AstTypeDecl, AstAsmFunctionDef, } from "./ast"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; import { CompilerContext, createContextStore } from "../context"; import { ItemOrigin } from "./src-info"; import { Parser } from "./grammar"; diff --git a/src/imports/resolveImports.ts b/src/imports/resolveImports.ts index b88c066cf..5e7994030 100644 --- a/src/imports/resolveImports.ts +++ b/src/imports/resolveImports.ts @@ -1,6 +1,6 @@ import { ItemOrigin, Parser } from "../grammar"; import { VirtualFileSystem } from "../vfs/VirtualFileSystem"; -import { throwCompilationError } from "../errors"; +import { throwCompilationError } from "../error/errors"; import { resolveLibrary } from "./resolveLibrary"; export function resolveImports(args: { diff --git a/src/index.ts b/src/index.ts index 15ec85cf7..4ffc2787f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ export { TactInternalCompilerError, TactConstEvalError, TactErrorCollection, -} from "./errors"; +} from "./error/errors"; export { optionsSchema, projectSchema, diff --git a/src/interpreter/constEval.ts b/src/interpreter/constEval.ts index d7946c4b4..0a4b2af50 100644 --- a/src/interpreter/constEval.ts +++ b/src/interpreter/constEval.ts @@ -6,7 +6,7 @@ import { AstValue, isValue, } from "../grammar/ast"; -import { TactConstEvalError } from "../errors"; +import { TactConstEvalError } from "../error/errors"; import { Value } from "../types/types"; import { AstUtil, extractValue } from "../optimizer/util"; import { ExpressionTransformer } from "../optimizer/types"; diff --git a/src/interpreter/interpreter.ts b/src/interpreter/interpreter.ts index d99660394..8dd7a7ddc 100644 --- a/src/interpreter/interpreter.ts +++ b/src/interpreter/interpreter.ts @@ -9,7 +9,7 @@ import { idTextErr, throwConstEvalError, throwInternalCompilerError, -} from "../errors"; +} from "../error/errors"; import { AstBinaryOperation, AstBoolean, diff --git a/src/main.ts b/src/main.ts index 76cc91a1b..abfb5a5af 100644 --- a/src/main.ts +++ b/src/main.ts @@ -16,4 +16,4 @@ export { createVirtualFileSystem } from "./vfs/createVirtualFileSystem"; export * from "./browser"; export * from "./verify"; export * from "./logger"; -export * from "./errors"; +export * from "./error/errors"; diff --git a/src/node.ts b/src/node.ts index a34676dbe..b882a8bc5 100644 --- a/src/node.ts +++ b/src/node.ts @@ -4,7 +4,7 @@ import { ConfigProject, Config, parseConfig } from "./config/parseConfig"; import { createNodeFileSystem } from "./vfs/createNodeFileSystem"; import { build } from "./pipeline/build"; import { LogLevel, Logger } from "./logger"; -import { TactErrorCollection } from "./errors"; +import { TactErrorCollection } from "./error/errors"; type AdditionalCliOptions = { mode?: ConfigProject["mode"]; diff --git a/src/optimizer/util.ts b/src/optimizer/util.ts index dc6ff85bd..9c158e35b 100644 --- a/src/optimizer/util.ts +++ b/src/optimizer/util.ts @@ -7,7 +7,7 @@ import { FactoryAst, } from "../grammar/ast"; import { dummySrcInfo } from "../grammar"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; import { Value } from "../types/types"; export function extractValue(ast: AstValue): Value { diff --git a/src/pipeline/build.ts b/src/pipeline/build.ts index d13216484..ea5b70a78 100644 --- a/src/pipeline/build.ts +++ b/src/pipeline/build.ts @@ -20,7 +20,7 @@ import { compile } from "./compile"; import { precompile } from "./precompile"; import { getCompilerVersion } from "./version"; import { FactoryAst, getAstFactory, idText } from "../grammar/ast"; -import { TactErrorCollection } from "../errors"; +import { TactErrorCollection } from "../error/errors"; import { getParser, Parser } from "../grammar"; import { defaultParser } from "../grammar/grammar"; diff --git a/src/storage/allocator.ts b/src/storage/allocator.ts index d12374389..2d388073e 100644 --- a/src/storage/allocator.ts +++ b/src/storage/allocator.ts @@ -4,7 +4,7 @@ import { AllocationOperation, AllocationOperationType, } from "./operation"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; const ALLOCATOR_RESERVE_BIT = 1; const ALLOCATOR_RESERVE_REF = 1; diff --git a/src/storage/resolveAllocation.ts b/src/storage/resolveAllocation.ts index 483b98b51..cacea64d9 100644 --- a/src/storage/resolveAllocation.ts +++ b/src/storage/resolveAllocation.ts @@ -7,7 +7,7 @@ import { AllocationOperation } from "./operation"; import { allocate, getAllocationOperationFromField } from "./allocator"; import { createABITypeRefFromTypeRef } from "../types/resolveABITypeRef"; import { funcInitIdOf } from "../generator/writers/id"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; import { idText } from "../grammar/ast"; const store = createContextStore(); diff --git a/src/types/resolveABITypeRef.ts b/src/types/resolveABITypeRef.ts index b2cf8e731..3f5390a3b 100644 --- a/src/types/resolveABITypeRef.ts +++ b/src/types/resolveABITypeRef.ts @@ -17,7 +17,7 @@ import { idTextErr, throwCompilationError, throwInternalCompilerError, -} from "../errors"; +} from "../error/errors"; import { TypeRef } from "./types"; import { CompilerContext } from "../context"; import { getType } from "./resolveDescriptors"; diff --git a/src/types/resolveDescriptors.ts b/src/types/resolveDescriptors.ts index 428e8afd8..66c9eb2ac 100644 --- a/src/types/resolveDescriptors.ts +++ b/src/types/resolveDescriptors.ts @@ -24,7 +24,7 @@ import { idTextErr, throwCompilationError, throwInternalCompilerError, -} from "../errors"; +} from "../error/errors"; import { CompilerContext, Store, createContextStore } from "../context"; import { ConstantDescription, diff --git a/src/types/resolveErrors.ts b/src/types/resolveErrors.ts index 31f8835a5..214ed9b88 100644 --- a/src/types/resolveErrors.ts +++ b/src/types/resolveErrors.ts @@ -3,7 +3,7 @@ import { CompilerContext, createContextStore } from "../context"; import { AstNode, isRequire } from "../grammar/ast"; import { traverse } from "../grammar/iterators"; import { evalConstantExpression } from "../interpreter/constEval"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; import { getAllStaticFunctions, getAllTypes, diff --git a/src/types/resolveExpression.ts b/src/types/resolveExpression.ts index f3d3e9c6e..66a4ea7a5 100644 --- a/src/types/resolveExpression.ts +++ b/src/types/resolveExpression.ts @@ -16,7 +16,7 @@ import { idText, isWildcard, } from "../grammar/ast"; -import { idTextErr, throwCompilationError } from "../errors"; +import { idTextErr, throwCompilationError } from "../error/errors"; import { CompilerContext, createContextStore } from "../context"; import { getAllTypes, @@ -31,7 +31,7 @@ import { StatementContext } from "./resolveStatements"; import { MapFunctions } from "../abi/map"; import { GlobalFunctions } from "../abi/global"; import { isAssignable, moreGeneralType } from "./subtyping"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; import { StructFunctions } from "../abi/struct"; import { prettyPrint } from "../prettyPrinter"; diff --git a/src/types/resolveSignatures.ts b/src/types/resolveSignatures.ts index 0060e46c9..bd2183bc8 100644 --- a/src/types/resolveSignatures.ts +++ b/src/types/resolveSignatures.ts @@ -6,14 +6,14 @@ import { idTextErr, throwConstEvalError, throwInternalCompilerError, -} from "../errors"; +} from "../error/errors"; import { getType, getAllTypes } from "./resolveDescriptors"; import { BinaryReceiverSelector, CommentReceiverSelector, ReceiverDescription, } from "./types"; -import { throwCompilationError } from "../errors"; +import { throwCompilationError } from "../error/errors"; import { AstNumber, AstReceiver } from "../grammar/ast"; import { commentPseudoOpcode } from "../generator/writers/writeRouter"; import { sha256_sync } from "@ton/crypto"; diff --git a/src/types/resolveStatements.ts b/src/types/resolveStatements.ts index 42bfb03ee..a2dfa1d64 100644 --- a/src/types/resolveStatements.ts +++ b/src/types/resolveStatements.ts @@ -16,7 +16,7 @@ import { throwCompilationError, throwConstEvalError, throwInternalCompilerError, -} from "../errors"; +} from "../error/errors"; import { getAllStaticFunctions, getStaticConstant, diff --git a/src/types/types.ts b/src/types/types.ts index 4bcdd65fa..6029c6b58 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,5 +1,5 @@ import { ABIField, Address, Cell, Slice } from "@ton/core"; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; import { AstConstantDef, AstFunctionDef, diff --git a/src/utils/tricks.ts b/src/utils/tricks.ts index 40ca8578a..1d81f566e 100644 --- a/src/utils/tricks.ts +++ b/src/utils/tricks.ts @@ -89,7 +89,7 @@ export const match = ( }) as MV, never>; }; -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; /** * Convert union to intersection. See https://stackoverflow.com/q/50374908 diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 8d3a45ec9..c5cd373a6 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -1,4 +1,4 @@ -import { throwInternalCompilerError } from "../errors"; +import { throwInternalCompilerError } from "../error/errors"; export function topologicalSort(src: T[], references: (src: T) => T[]) { const result: T[] = []; From d4e5b2a4e8e54214ce61f292e1bff89bb14b1c36 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:25:41 +0400 Subject: [PATCH 04/26] rename config --- src/{config => 000-config}/features.ts | 0 src/{config => 000-config}/parseConfig.ts | 0 src/abi/global.ts | 2 +- src/browser.ts | 2 +- src/generator/writers/writeContract.ts | 2 +- src/generator/writers/writeFunction.ts | 2 +- src/index.ts | 2 +- src/main.ts | 2 +- src/node.ts | 2 +- src/pipeline/build.ts | 4 ++-- src/types/getSupportedInterfaces.ts | 2 +- src/types/resolveDescriptors.spec.ts | 2 +- src/types/resolveDescriptors.ts | 2 +- src/types/resolveStatements.spec.ts | 2 +- src/verify.ts | 2 +- 15 files changed, 14 insertions(+), 14 deletions(-) rename src/{config => 000-config}/features.ts (100%) rename src/{config => 000-config}/parseConfig.ts (100%) diff --git a/src/config/features.ts b/src/000-config/features.ts similarity index 100% rename from src/config/features.ts rename to src/000-config/features.ts diff --git a/src/config/parseConfig.ts b/src/000-config/parseConfig.ts similarity index 100% rename from src/config/parseConfig.ts rename to src/000-config/parseConfig.ts diff --git a/src/abi/global.ts b/src/abi/global.ts index 015dbd851..4bd19256b 100644 --- a/src/abi/global.ts +++ b/src/abi/global.ts @@ -1,5 +1,5 @@ import { Address, beginCell, Cell, toNano } from "@ton/core"; -import { enabledDebug } from "../config/features"; +import { enabledDebug } from "../000-config/features"; import { writeAddress, writeCell, diff --git a/src/browser.ts b/src/browser.ts index 84cd88e10..8ccbeee7f 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -1,4 +1,4 @@ -import { Config, verifyConfig } from "./config/parseConfig"; +import { Config, verifyConfig } from "./000-config/parseConfig"; import { ILogger } from "./logger"; import { build } from "./pipeline/build"; import { createVirtualFileSystem } from "./vfs/createVirtualFileSystem"; diff --git a/src/generator/writers/writeContract.ts b/src/generator/writers/writeContract.ts index b205e8c3b..2b5eeb1e9 100644 --- a/src/generator/writers/writeContract.ts +++ b/src/generator/writers/writeContract.ts @@ -3,7 +3,7 @@ import { enabledInline, enabledInterfacesGetter, enabledIpfsAbiGetter, -} from "../../config/features"; +} from "../../000-config/features"; import { ItemOrigin } from "../../grammar"; import { InitDescription, TypeDescription } from "../../types/types"; import { WriterContext } from "../Writer"; diff --git a/src/generator/writers/writeFunction.ts b/src/generator/writers/writeFunction.ts index 41143612b..af79d3637 100644 --- a/src/generator/writers/writeFunction.ts +++ b/src/generator/writers/writeFunction.ts @@ -1,4 +1,4 @@ -import { enabledInline } from "../../config/features"; +import { enabledInline } from "../../000-config/features"; import { AstAsmShuffle, AstCondition, diff --git a/src/index.ts b/src/index.ts index 4ffc2787f..bb716dc8b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,7 +11,7 @@ export { optionsSchema, projectSchema, configSchema, -} from "./config/parseConfig"; +} from "./000-config/parseConfig"; export { AstSorter } from "./grammar/sort"; export { AstRenamer } from "./grammar/rename"; export { AstHasher } from "./grammar/hash"; diff --git a/src/main.ts b/src/main.ts index abfb5a5af..16a8fc0e7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,7 +3,7 @@ export { ConfigProject, parseConfig, verifyConfig, -} from "./config/parseConfig"; +} from "./000-config/parseConfig"; export { PackageFileFormat } from "./packaging/fileFormat"; diff --git a/src/node.ts b/src/node.ts index b882a8bc5..aea130cd5 100644 --- a/src/node.ts +++ b/src/node.ts @@ -1,6 +1,6 @@ import path from "path"; import fs from "fs"; -import { ConfigProject, Config, parseConfig } from "./config/parseConfig"; +import { ConfigProject, Config, parseConfig } from "./000-config/parseConfig"; import { createNodeFileSystem } from "./vfs/createNodeFileSystem"; import { build } from "./pipeline/build"; import { LogLevel, Logger } from "./logger"; diff --git a/src/pipeline/build.ts b/src/pipeline/build.ts index ea5b70a78..919d07b43 100644 --- a/src/pipeline/build.ts +++ b/src/pipeline/build.ts @@ -1,8 +1,8 @@ import { beginCell, Cell, Dictionary } from "@ton/core"; import { decompileAll } from "@tact-lang/opcode"; import { writeTypescript } from "../bindings/writeTypescript"; -import { featureEnable } from "../config/features"; -import { ConfigProject } from "../config/parseConfig"; +import { featureEnable } from "../000-config/features"; +import { ConfigProject } from "../000-config/parseConfig"; import { CompilerContext } from "../context"; import { funcCompile } from "../func/funcCompile"; import { writeReport } from "../generator/writeReport"; diff --git a/src/types/getSupportedInterfaces.ts b/src/types/getSupportedInterfaces.ts index 2ac15702f..a8323ca01 100644 --- a/src/types/getSupportedInterfaces.ts +++ b/src/types/getSupportedInterfaces.ts @@ -1,4 +1,4 @@ -import { enabledDebug } from "../config/features"; +import { enabledDebug } from "../000-config/features"; import { CompilerContext } from "../context"; import { TypeDescription } from "./types"; diff --git a/src/types/resolveDescriptors.spec.ts b/src/types/resolveDescriptors.spec.ts index c662b9cf7..500a4d632 100644 --- a/src/types/resolveDescriptors.spec.ts +++ b/src/types/resolveDescriptors.spec.ts @@ -7,7 +7,7 @@ import { import { resolveSignatures } from "./resolveSignatures"; import { loadCases } from "../utils/loadCases"; import { openContext } from "../grammar/store"; -import { featureEnable } from "../config/features"; +import { featureEnable } from "../000-config/features"; import { getParser, SrcInfo } from "../grammar"; import { getAstFactory } from "../grammar/ast"; import { isSrcInfo } from "../grammar/src-info"; diff --git a/src/types/resolveDescriptors.ts b/src/types/resolveDescriptors.ts index 66c9eb2ac..265921c00 100644 --- a/src/types/resolveDescriptors.ts +++ b/src/types/resolveDescriptors.ts @@ -50,7 +50,7 @@ import { intMapKeyFormats, intMapValFormats, } from "./resolveABITypeRef"; -import { enabledExternals } from "../config/features"; +import { enabledExternals } from "../000-config/features"; import { isRuntimeType } from "./isRuntimeType"; import { GlobalFunctions } from "../abi/global"; import { ItemOrigin } from "../grammar"; diff --git a/src/types/resolveStatements.spec.ts b/src/types/resolveStatements.spec.ts index 90c2c0d81..54128ac0f 100644 --- a/src/types/resolveStatements.spec.ts +++ b/src/types/resolveStatements.spec.ts @@ -4,7 +4,7 @@ import { loadCases } from "../utils/loadCases"; import { openContext } from "../grammar/store"; import { resolveStatements } from "./resolveStatements"; import { CompilerContext } from "../context"; -import { featureEnable } from "../config/features"; +import { featureEnable } from "../000-config/features"; import { getParser } from "../grammar"; import { getAstFactory } from "../grammar/ast"; import { defaultParser } from "../grammar/grammar"; diff --git a/src/verify.ts b/src/verify.ts index 7ea3d8054..e4993a38d 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -1,6 +1,6 @@ import normalize from "path-normalize"; import { Cell } from "@ton/core"; -import { Config, Options } from "./config/parseConfig"; +import { Config, Options } from "./000-config/parseConfig"; import { ILogger, Logger } from "./logger"; import { PackageFileFormat, run } from "./main"; import { fileFormat } from "./packaging/fileFormat"; From 501dbb0675eafbd6ae8a7bb8ded08a0193fc8a5a Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:27:13 +0400 Subject: [PATCH 05/26] move globals --- CONTRIBUTING.md | 4 ++-- scripts/prepare.ts | 4 ++-- src/000-config/features.ts | 2 +- src/{pipeline => 010-pipeline}/build.ts | 4 ++-- src/{pipeline => 010-pipeline}/compile.ts | 2 +- src/{ => 010-pipeline}/context.ts | 0 src/{ => 010-pipeline}/logger.ts | 0 src/{pipeline => 010-pipeline}/precompile.ts | 2 +- src/{pipeline => 010-pipeline}/version.ts | 0 src/abi/AbiFunction.ts | 2 +- src/abi/map.ts | 2 +- src/browser.ts | 4 ++-- src/func/funcCompile.spec.ts | 2 +- src/func/funcCompile.ts | 2 +- src/generator/Writer.ts | 2 +- src/generator/createABI.ts | 2 +- src/generator/writeProgram.ts | 2 +- src/generator/writeReport.ts | 2 +- src/generator/writers/resolveFuncType.spec.ts | 2 +- src/generator/writers/writeExpression.spec.ts | 2 +- src/generator/writers/writeSerialization.spec.ts | 2 +- src/grammar/store.ts | 2 +- src/index.ts | 4 ++-- src/interpreter/constEval.ts | 2 +- src/interpreter/interpreter.ts | 2 +- src/main.ts | 4 ++-- src/node.ts | 4 ++-- src/optimizer/test/partial-eval.spec.ts | 2 +- src/storage/resolveAllocation.spec.ts | 2 +- src/storage/resolveAllocation.ts | 2 +- src/types/getSupportedInterfaces.ts | 2 +- src/types/resolveABITypeRef.ts | 2 +- src/types/resolveDescriptors.spec.ts | 2 +- src/types/resolveDescriptors.ts | 2 +- src/types/resolveErrors.ts | 2 +- src/types/resolveExpression.ts | 2 +- src/types/resolveSignatures.ts | 2 +- src/types/resolveStatements.spec.ts | 2 +- src/types/resolveStatements.ts | 2 +- src/verify.ts | 4 ++-- 40 files changed, 45 insertions(+), 45 deletions(-) rename src/{pipeline => 010-pipeline}/build.ts (99%) rename src/{pipeline => 010-pipeline}/compile.ts (89%) rename src/{ => 010-pipeline}/context.ts (100%) rename src/{ => 010-pipeline}/logger.ts (100%) rename src/{pipeline => 010-pipeline}/precompile.ts (97%) rename src/{pipeline => 010-pipeline}/version.ts (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7e6603f76..d192ad2ca 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -105,11 +105,11 @@ yarn knip Tact's command-line interface (CLI) is located in [bin/tact.js](./bin/tact.js). Tact uses the [meow](https://github.com/sindresorhus/meow) CLI arguments parser. -The main entry point for the Tact CLI is [src/node.ts](./src/node.ts) and [src/pipeline/build.ts](./src/pipeline/build.ts) is the platform-independent compiler driver which contains the high-level compiler pipeline logic described above. +The main entry point for the Tact CLI is [src/node.ts](./src/node.ts) and [src/pipeline/build.ts](src/010-pipeline/build.ts) is the platform-independent compiler driver which contains the high-level compiler pipeline logic described above. The Tact CLI gets Tact settings from a `tact.config.json` file or creates a default config for a single-file compilation mode. The format of `tact.config.json` files is specified in [schemas/configSchema.json](./schemas/configSchema.json). -The so-called "pre-compilation" steps that include imports resolution, type-checking, building schemas for high-level Tact data structures to be serialized/deserialized as cells (this step is dubbed "allocation") are located in [src/pipeline/precompile.ts](src/pipeline/precompile.ts). +The so-called "pre-compilation" steps that include imports resolution, type-checking, building schemas for high-level Tact data structures to be serialized/deserialized as cells (this step is dubbed "allocation") are located in [src/pipeline/precompile.ts](src/010-pipeline/precompile.ts). Besides the terminal, the Tact compiler is supposed to work in browser environments as well. diff --git a/scripts/prepare.ts b/scripts/prepare.ts index f9009db52..123fe6bff 100644 --- a/scripts/prepare.ts +++ b/scripts/prepare.ts @@ -5,8 +5,8 @@ import { FuncCompilationResult, funcCompile } from "../src/func/funcCompile"; import path from "path"; import { glob } from "glob"; import { verify } from "../src/verify"; -import { Logger } from "../src/logger"; -import { __DANGER__disableVersionNumber } from "../src/pipeline/version"; +import { Logger } from "../src/010-pipeline/logger"; +import { __DANGER__disableVersionNumber } from "../src/010-pipeline/version"; // Read cases void (async () => { diff --git a/src/000-config/features.ts b/src/000-config/features.ts index 1b9cc5a14..4832493b8 100644 --- a/src/000-config/features.ts +++ b/src/000-config/features.ts @@ -1,4 +1,4 @@ -import { CompilerContext, createContextStore } from "../context"; +import { CompilerContext, createContextStore } from "../010-pipeline/context"; const featureStore = createContextStore(); diff --git a/src/pipeline/build.ts b/src/010-pipeline/build.ts similarity index 99% rename from src/pipeline/build.ts rename to src/010-pipeline/build.ts index 919d07b43..aa4a317ae 100644 --- a/src/pipeline/build.ts +++ b/src/010-pipeline/build.ts @@ -3,12 +3,12 @@ import { decompileAll } from "@tact-lang/opcode"; import { writeTypescript } from "../bindings/writeTypescript"; import { featureEnable } from "../000-config/features"; import { ConfigProject } from "../000-config/parseConfig"; -import { CompilerContext } from "../context"; +import { CompilerContext } from "./context"; import { funcCompile } from "../func/funcCompile"; import { writeReport } from "../generator/writeReport"; import { getRawAST } from "../grammar/store"; import files from "../imports/stdlib"; -import { ILogger, Logger } from "../logger"; +import { ILogger, Logger } from "./logger"; import { PackageFileFormat } from "../packaging/fileFormat"; import { packageCode } from "../packaging/packageCode"; import { createABITypeRefFromTypeRef } from "../types/resolveABITypeRef"; diff --git a/src/pipeline/compile.ts b/src/010-pipeline/compile.ts similarity index 89% rename from src/pipeline/compile.ts rename to src/010-pipeline/compile.ts index 84fde8302..6fa2888f9 100644 --- a/src/pipeline/compile.ts +++ b/src/010-pipeline/compile.ts @@ -1,4 +1,4 @@ -import { CompilerContext } from "../context"; +import { CompilerContext } from "./context"; import { createABI } from "../generator/createABI"; import { writeProgram } from "../generator/writeProgram"; diff --git a/src/context.ts b/src/010-pipeline/context.ts similarity index 100% rename from src/context.ts rename to src/010-pipeline/context.ts diff --git a/src/logger.ts b/src/010-pipeline/logger.ts similarity index 100% rename from src/logger.ts rename to src/010-pipeline/logger.ts diff --git a/src/pipeline/precompile.ts b/src/010-pipeline/precompile.ts similarity index 97% rename from src/pipeline/precompile.ts rename to src/010-pipeline/precompile.ts index 8695f5c14..85cd46bff 100644 --- a/src/pipeline/precompile.ts +++ b/src/010-pipeline/precompile.ts @@ -1,4 +1,4 @@ -import { CompilerContext } from "../context"; +import { CompilerContext } from "./context"; import { resolveDescriptors } from "../types/resolveDescriptors"; import { resolveAllocations } from "../storage/resolveAllocation"; import { openContext } from "../grammar/store"; diff --git a/src/pipeline/version.ts b/src/010-pipeline/version.ts similarity index 100% rename from src/pipeline/version.ts rename to src/010-pipeline/version.ts diff --git a/src/abi/AbiFunction.ts b/src/abi/AbiFunction.ts index 00faa5f73..502702cd4 100644 --- a/src/abi/AbiFunction.ts +++ b/src/abi/AbiFunction.ts @@ -1,5 +1,5 @@ import { AstExpression } from "../grammar/ast"; -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { WriterContext } from "../generator/Writer"; import { TypeRef } from "../types/types"; import { SrcInfo } from "../grammar"; diff --git a/src/abi/map.ts b/src/abi/map.ts index f17d5cb90..caf890cba 100644 --- a/src/abi/map.ts +++ b/src/abi/map.ts @@ -1,4 +1,4 @@ -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { SrcInfo } from "../grammar"; import { TypeRef } from "../types/types"; import { WriterContext } from "../generator/Writer"; diff --git a/src/browser.ts b/src/browser.ts index 8ccbeee7f..5fafcc4bf 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -1,6 +1,6 @@ import { Config, verifyConfig } from "./000-config/parseConfig"; -import { ILogger } from "./logger"; -import { build } from "./pipeline/build"; +import { ILogger } from "./010-pipeline/logger"; +import { build } from "./010-pipeline/build"; import { createVirtualFileSystem } from "./vfs/createVirtualFileSystem"; export async function run(args: { diff --git a/src/func/funcCompile.spec.ts b/src/func/funcCompile.spec.ts index 60e937b10..e1774d2c7 100644 --- a/src/func/funcCompile.spec.ts +++ b/src/func/funcCompile.spec.ts @@ -1,6 +1,6 @@ import fs from "fs"; import path from "path"; -import { Logger } from "../logger"; +import { Logger } from "../010-pipeline/logger"; import { funcCompile } from "./funcCompile"; import files from "../imports/stdlib"; diff --git a/src/func/funcCompile.ts b/src/func/funcCompile.ts index d6fb400db..811322e79 100644 --- a/src/func/funcCompile.ts +++ b/src/func/funcCompile.ts @@ -1,4 +1,4 @@ -import { ILogger } from "../logger"; +import { ILogger } from "../010-pipeline/logger"; // Wasm Imports // eslint-disable-next-line @typescript-eslint/no-var-requires diff --git a/src/generator/Writer.ts b/src/generator/Writer.ts index 7c13eca6d..898e9b570 100644 --- a/src/generator/Writer.ts +++ b/src/generator/Writer.ts @@ -1,4 +1,4 @@ -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { escapeUnicodeControlCodes, trimIndent } from "../utils/text"; import { topologicalSort } from "../utils/utils"; import { Writer } from "../utils/Writer"; diff --git a/src/generator/createABI.ts b/src/generator/createABI.ts index 4aa7b4ff8..a9d21869e 100644 --- a/src/generator/createABI.ts +++ b/src/generator/createABI.ts @@ -1,6 +1,6 @@ import { ABIGetter, ABIReceiver, ABIType, ContractABI } from "@ton/core"; import { contractErrors } from "../abi/errors"; -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { idText } from "../grammar/ast"; import { getSupportedInterfaces } from "../types/getSupportedInterfaces"; import { createABITypeRefFromTypeRef } from "../types/resolveABITypeRef"; diff --git a/src/generator/writeProgram.ts b/src/generator/writeProgram.ts index 7523c8385..990cf7b24 100644 --- a/src/generator/writeProgram.ts +++ b/src/generator/writeProgram.ts @@ -1,4 +1,4 @@ -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { getAllocation, getSortedTypes } from "../storage/resolveAllocation"; import { getAllStaticFunctions, diff --git a/src/generator/writeReport.ts b/src/generator/writeReport.ts index 62250f53d..be67d5c52 100644 --- a/src/generator/writeReport.ts +++ b/src/generator/writeReport.ts @@ -1,5 +1,5 @@ import { ContractABI } from "@ton/core"; -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { PackageFileFormat } from "../packaging/fileFormat"; import { getType } from "../types/resolveDescriptors"; import { Writer } from "../utils/Writer"; diff --git a/src/generator/writers/resolveFuncType.spec.ts b/src/generator/writers/resolveFuncType.spec.ts index d41fca3c6..ab0b38413 100644 --- a/src/generator/writers/resolveFuncType.spec.ts +++ b/src/generator/writers/resolveFuncType.spec.ts @@ -3,7 +3,7 @@ import { resolveDescriptors } from "../../types/resolveDescriptors"; import { WriterContext } from "../Writer"; import { resolveFuncType } from "./resolveFuncType"; import { openContext } from "../../grammar/store"; -import { CompilerContext } from "../../context"; +import { CompilerContext } from "../../010-pipeline/context"; import { getParser } from "../../grammar"; import { defaultParser } from "../../grammar/grammar"; diff --git a/src/generator/writers/writeExpression.spec.ts b/src/generator/writers/writeExpression.spec.ts index 2b12b8d95..37ca8232f 100644 --- a/src/generator/writers/writeExpression.spec.ts +++ b/src/generator/writers/writeExpression.spec.ts @@ -6,7 +6,7 @@ import { WriterContext } from "../Writer"; import { writeExpression } from "./writeExpression"; import { openContext } from "../../grammar/store"; import { resolveStatements } from "../../types/resolveStatements"; -import { CompilerContext } from "../../context"; +import { CompilerContext } from "../../010-pipeline/context"; import { getParser } from "../../grammar"; import { getAstFactory } from "../../grammar/ast"; import { defaultParser } from "../../grammar/grammar"; diff --git a/src/generator/writers/writeSerialization.spec.ts b/src/generator/writers/writeSerialization.spec.ts index 11279ee7d..0f58cdcaa 100644 --- a/src/generator/writers/writeSerialization.spec.ts +++ b/src/generator/writers/writeSerialization.spec.ts @@ -1,4 +1,4 @@ -import { CompilerContext } from "../../context"; +import { CompilerContext } from "../../010-pipeline/context"; import { getAllocation, resolveAllocations, diff --git a/src/grammar/store.ts b/src/grammar/store.ts index 21092e297..40868c51b 100644 --- a/src/grammar/store.ts +++ b/src/grammar/store.ts @@ -7,7 +7,7 @@ import { AstAsmFunctionDef, } from "./ast"; import { throwInternalCompilerError } from "../error/errors"; -import { CompilerContext, createContextStore } from "../context"; +import { CompilerContext, createContextStore } from "../010-pipeline/context"; import { ItemOrigin } from "./src-info"; import { Parser } from "./grammar"; diff --git a/src/index.ts b/src/index.ts index bb716dc8b..ff527457b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ -export { enableFeatures, build } from "./pipeline/build"; -export { precompile } from "./pipeline/precompile"; +export { enableFeatures, build } from "./010-pipeline/build"; +export { precompile } from "./010-pipeline/precompile"; export { TactError, TactCompilationError, diff --git a/src/interpreter/constEval.ts b/src/interpreter/constEval.ts index 0a4b2af50..4e4bb24d5 100644 --- a/src/interpreter/constEval.ts +++ b/src/interpreter/constEval.ts @@ -1,4 +1,4 @@ -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { AstBinaryOperation, AstExpression, diff --git a/src/interpreter/interpreter.ts b/src/interpreter/interpreter.ts index 8dd7a7ddc..93a8f995e 100644 --- a/src/interpreter/interpreter.ts +++ b/src/interpreter/interpreter.ts @@ -2,7 +2,7 @@ import { Address, beginCell, BitString, Cell, Slice, toNano } from "@ton/core"; import { paddedBufferToBits } from "@ton/core/dist/boc/utils/paddedBits"; import * as crc32 from "crc-32"; import { evalConstantExpression } from "./constEval"; -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { TactCompilationError, TactConstEvalError, diff --git a/src/main.ts b/src/main.ts index 16a8fc0e7..1cb69145d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -7,7 +7,7 @@ export { export { PackageFileFormat } from "./packaging/fileFormat"; -export { build } from "./pipeline/build"; +export { build } from "./010-pipeline/build"; export { VirtualFileSystem } from "./vfs/VirtualFileSystem"; @@ -15,5 +15,5 @@ export { createVirtualFileSystem } from "./vfs/createVirtualFileSystem"; export * from "./browser"; export * from "./verify"; -export * from "./logger"; +export * from "./010-pipeline/logger"; export * from "./error/errors"; diff --git a/src/node.ts b/src/node.ts index aea130cd5..a948c8ef4 100644 --- a/src/node.ts +++ b/src/node.ts @@ -2,8 +2,8 @@ import path from "path"; import fs from "fs"; import { ConfigProject, Config, parseConfig } from "./000-config/parseConfig"; import { createNodeFileSystem } from "./vfs/createNodeFileSystem"; -import { build } from "./pipeline/build"; -import { LogLevel, Logger } from "./logger"; +import { build } from "./010-pipeline/build"; +import { LogLevel, Logger } from "./010-pipeline/logger"; import { TactErrorCollection } from "./error/errors"; type AdditionalCliOptions = { diff --git a/src/optimizer/test/partial-eval.spec.ts b/src/optimizer/test/partial-eval.spec.ts index 682ca5d43..b46624f52 100644 --- a/src/optimizer/test/partial-eval.spec.ts +++ b/src/optimizer/test/partial-eval.spec.ts @@ -8,7 +8,7 @@ import { } from "../../grammar/ast"; import { AstUtil, extractValue, getAstUtil } from "../util"; import { getOptimizer } from "../../interpreter/constEval"; -import { CompilerContext } from "../../context"; +import { CompilerContext } from "../../010-pipeline/context"; import { ExpressionTransformer, Rule } from "../types"; import { AssociativeRule3 } from "../associative"; import { evalBinaryOp, evalUnaryOp } from "../../interpreter/interpreter"; diff --git a/src/storage/resolveAllocation.spec.ts b/src/storage/resolveAllocation.spec.ts index e784bb90c..651292b9a 100644 --- a/src/storage/resolveAllocation.spec.ts +++ b/src/storage/resolveAllocation.spec.ts @@ -3,7 +3,7 @@ import { resolveDescriptors } from "../types/resolveDescriptors"; import { getAllocations, resolveAllocations } from "./resolveAllocation"; import { openContext } from "../grammar/store"; import { resolveStatements } from "../types/resolveStatements"; -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { resolveSignatures } from "../types/resolveSignatures"; import path from "path"; import { getParser } from "../grammar"; diff --git a/src/storage/resolveAllocation.ts b/src/storage/resolveAllocation.ts index cacea64d9..6acd7a33e 100644 --- a/src/storage/resolveAllocation.ts +++ b/src/storage/resolveAllocation.ts @@ -1,4 +1,4 @@ -import { CompilerContext, createContextStore } from "../context"; +import { CompilerContext, createContextStore } from "../010-pipeline/context"; import { getType, toBounced, getAllTypes } from "../types/resolveDescriptors"; import { TypeDescription } from "../types/types"; import { topologicalSort } from "../utils/utils"; diff --git a/src/types/getSupportedInterfaces.ts b/src/types/getSupportedInterfaces.ts index a8323ca01..0acbbe3e6 100644 --- a/src/types/getSupportedInterfaces.ts +++ b/src/types/getSupportedInterfaces.ts @@ -1,5 +1,5 @@ import { enabledDebug } from "../000-config/features"; -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { TypeDescription } from "./types"; export function getSupportedInterfaces( diff --git a/src/types/resolveABITypeRef.ts b/src/types/resolveABITypeRef.ts index 3f5390a3b..61a010899 100644 --- a/src/types/resolveABITypeRef.ts +++ b/src/types/resolveABITypeRef.ts @@ -19,7 +19,7 @@ import { throwInternalCompilerError, } from "../error/errors"; import { TypeRef } from "./types"; -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { getType } from "./resolveDescriptors"; import { SrcInfo } from "../grammar"; diff --git a/src/types/resolveDescriptors.spec.ts b/src/types/resolveDescriptors.spec.ts index 500a4d632..19223b95c 100644 --- a/src/types/resolveDescriptors.spec.ts +++ b/src/types/resolveDescriptors.spec.ts @@ -1,4 +1,4 @@ -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { getAllStaticFunctions, getAllTypes, diff --git a/src/types/resolveDescriptors.ts b/src/types/resolveDescriptors.ts index 265921c00..840caeb32 100644 --- a/src/types/resolveDescriptors.ts +++ b/src/types/resolveDescriptors.ts @@ -25,7 +25,7 @@ import { throwCompilationError, throwInternalCompilerError, } from "../error/errors"; -import { CompilerContext, Store, createContextStore } from "../context"; +import { CompilerContext, Store, createContextStore } from "../010-pipeline/context"; import { ConstantDescription, FieldDescription, diff --git a/src/types/resolveErrors.ts b/src/types/resolveErrors.ts index 214ed9b88..b01b0e343 100644 --- a/src/types/resolveErrors.ts +++ b/src/types/resolveErrors.ts @@ -1,5 +1,5 @@ import { sha256_sync } from "@ton/crypto"; -import { CompilerContext, createContextStore } from "../context"; +import { CompilerContext, createContextStore } from "../010-pipeline/context"; import { AstNode, isRequire } from "../grammar/ast"; import { traverse } from "../grammar/iterators"; import { evalConstantExpression } from "../interpreter/constEval"; diff --git a/src/types/resolveExpression.ts b/src/types/resolveExpression.ts index 66a4ea7a5..7fc658e09 100644 --- a/src/types/resolveExpression.ts +++ b/src/types/resolveExpression.ts @@ -17,7 +17,7 @@ import { isWildcard, } from "../grammar/ast"; import { idTextErr, throwCompilationError } from "../error/errors"; -import { CompilerContext, createContextStore } from "../context"; +import { CompilerContext, createContextStore } from "../010-pipeline/context"; import { getAllTypes, getStaticConstant, diff --git a/src/types/resolveSignatures.ts b/src/types/resolveSignatures.ts index bd2183bc8..5429000fc 100644 --- a/src/types/resolveSignatures.ts +++ b/src/types/resolveSignatures.ts @@ -1,6 +1,6 @@ import * as changeCase from "change-case"; import { ABIField, beginCell } from "@ton/core"; -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { idToHex } from "../utils/idToHex"; import { idTextErr, diff --git a/src/types/resolveStatements.spec.ts b/src/types/resolveStatements.spec.ts index 54128ac0f..e8f41cb35 100644 --- a/src/types/resolveStatements.spec.ts +++ b/src/types/resolveStatements.spec.ts @@ -3,7 +3,7 @@ import { resolveDescriptors } from "./resolveDescriptors"; import { loadCases } from "../utils/loadCases"; import { openContext } from "../grammar/store"; import { resolveStatements } from "./resolveStatements"; -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { featureEnable } from "../000-config/features"; import { getParser } from "../grammar"; import { getAstFactory } from "../grammar/ast"; diff --git a/src/types/resolveStatements.ts b/src/types/resolveStatements.ts index a2dfa1d64..865354fd2 100644 --- a/src/types/resolveStatements.ts +++ b/src/types/resolveStatements.ts @@ -1,4 +1,4 @@ -import { CompilerContext } from "../context"; +import { CompilerContext } from "../010-pipeline/context"; import { AstCondition, AstStatement, diff --git a/src/verify.ts b/src/verify.ts index e4993a38d..0b176e828 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -1,10 +1,10 @@ import normalize from "path-normalize"; import { Cell } from "@ton/core"; import { Config, Options } from "./000-config/parseConfig"; -import { ILogger, Logger } from "./logger"; +import { ILogger, Logger } from "./010-pipeline/logger"; import { PackageFileFormat, run } from "./main"; import { fileFormat } from "./packaging/fileFormat"; -import { getCompilerVersion } from "./pipeline/version"; +import { getCompilerVersion } from "./010-pipeline/version"; export type VerifyResult = | { From e45f01eaa360235cc5f5f5dcb0ab9b921b962892 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:30:28 +0400 Subject: [PATCH 06/26] move vfs --- src/010-pipeline/build.ts | 4 ++-- src/010-pipeline/precompile.ts | 2 +- src/{vfs => 020-vfs}/VirtualFileSystem.ts | 0 src/{vfs => 020-vfs}/__testdata/.keep | 0 src/{vfs => 020-vfs}/createNodeFileSystem.spec.ts | 0 src/{vfs => 020-vfs}/createNodeFileSystem.ts | 0 src/{vfs => 020-vfs}/createVirtualFileSystem.spec.ts | 0 src/{vfs => 020-vfs}/createVirtualFileSystem.ts | 0 src/browser.ts | 2 +- src/imports/resolveImports.spec.ts | 2 +- src/imports/resolveImports.ts | 2 +- src/imports/resolveLibrary.spec.ts | 2 +- src/imports/resolveLibrary.ts | 2 +- src/main.ts | 4 ++-- src/node.ts | 4 ++-- 15 files changed, 12 insertions(+), 12 deletions(-) rename src/{vfs => 020-vfs}/VirtualFileSystem.ts (100%) rename src/{vfs => 020-vfs}/__testdata/.keep (100%) rename src/{vfs => 020-vfs}/createNodeFileSystem.spec.ts (100%) rename src/{vfs => 020-vfs}/createNodeFileSystem.ts (100%) rename src/{vfs => 020-vfs}/createVirtualFileSystem.spec.ts (100%) rename src/{vfs => 020-vfs}/createVirtualFileSystem.ts (100%) diff --git a/src/010-pipeline/build.ts b/src/010-pipeline/build.ts index aa4a317ae..897568922 100644 --- a/src/010-pipeline/build.ts +++ b/src/010-pipeline/build.ts @@ -14,8 +14,8 @@ import { packageCode } from "../packaging/packageCode"; import { createABITypeRefFromTypeRef } from "../types/resolveABITypeRef"; import { getContracts, getType } from "../types/resolveDescriptors"; import { posixNormalize } from "../utils/filePath"; -import { createVirtualFileSystem } from "../vfs/createVirtualFileSystem"; -import { VirtualFileSystem } from "../vfs/VirtualFileSystem"; +import { createVirtualFileSystem } from "../020-vfs/createVirtualFileSystem"; +import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; import { compile } from "./compile"; import { precompile } from "./precompile"; import { getCompilerVersion } from "./version"; diff --git a/src/010-pipeline/precompile.ts b/src/010-pipeline/precompile.ts index 85cd46bff..3186e7b02 100644 --- a/src/010-pipeline/precompile.ts +++ b/src/010-pipeline/precompile.ts @@ -6,7 +6,7 @@ import { resolveStatements } from "../types/resolveStatements"; import { resolveErrors } from "../types/resolveErrors"; import { resolveSignatures } from "../types/resolveSignatures"; import { resolveImports } from "../imports/resolveImports"; -import { VirtualFileSystem } from "../vfs/VirtualFileSystem"; +import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; import { AstModule, FactoryAst } from "../grammar/ast"; import { Parser } from "../grammar"; diff --git a/src/vfs/VirtualFileSystem.ts b/src/020-vfs/VirtualFileSystem.ts similarity index 100% rename from src/vfs/VirtualFileSystem.ts rename to src/020-vfs/VirtualFileSystem.ts diff --git a/src/vfs/__testdata/.keep b/src/020-vfs/__testdata/.keep similarity index 100% rename from src/vfs/__testdata/.keep rename to src/020-vfs/__testdata/.keep diff --git a/src/vfs/createNodeFileSystem.spec.ts b/src/020-vfs/createNodeFileSystem.spec.ts similarity index 100% rename from src/vfs/createNodeFileSystem.spec.ts rename to src/020-vfs/createNodeFileSystem.spec.ts diff --git a/src/vfs/createNodeFileSystem.ts b/src/020-vfs/createNodeFileSystem.ts similarity index 100% rename from src/vfs/createNodeFileSystem.ts rename to src/020-vfs/createNodeFileSystem.ts diff --git a/src/vfs/createVirtualFileSystem.spec.ts b/src/020-vfs/createVirtualFileSystem.spec.ts similarity index 100% rename from src/vfs/createVirtualFileSystem.spec.ts rename to src/020-vfs/createVirtualFileSystem.spec.ts diff --git a/src/vfs/createVirtualFileSystem.ts b/src/020-vfs/createVirtualFileSystem.ts similarity index 100% rename from src/vfs/createVirtualFileSystem.ts rename to src/020-vfs/createVirtualFileSystem.ts diff --git a/src/browser.ts b/src/browser.ts index 5fafcc4bf..2e8e8da2f 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -1,7 +1,7 @@ import { Config, verifyConfig } from "./000-config/parseConfig"; import { ILogger } from "./010-pipeline/logger"; import { build } from "./010-pipeline/build"; -import { createVirtualFileSystem } from "./vfs/createVirtualFileSystem"; +import { createVirtualFileSystem } from "./020-vfs/createVirtualFileSystem"; export async function run(args: { config: Config; diff --git a/src/imports/resolveImports.spec.ts b/src/imports/resolveImports.spec.ts index c67bdaa80..8f0e3d27c 100644 --- a/src/imports/resolveImports.spec.ts +++ b/src/imports/resolveImports.spec.ts @@ -1,5 +1,5 @@ import { resolveImports } from "./resolveImports"; -import { createNodeFileSystem } from "../vfs/createNodeFileSystem"; +import { createNodeFileSystem } from "../020-vfs/createNodeFileSystem"; import path from "path"; import { getParser } from "../grammar"; import { getAstFactory } from "../grammar/ast"; diff --git a/src/imports/resolveImports.ts b/src/imports/resolveImports.ts index 5e7994030..5a81da5bc 100644 --- a/src/imports/resolveImports.ts +++ b/src/imports/resolveImports.ts @@ -1,5 +1,5 @@ import { ItemOrigin, Parser } from "../grammar"; -import { VirtualFileSystem } from "../vfs/VirtualFileSystem"; +import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; import { throwCompilationError } from "../error/errors"; import { resolveLibrary } from "./resolveLibrary"; diff --git a/src/imports/resolveLibrary.spec.ts b/src/imports/resolveLibrary.spec.ts index e28868b8b..9f653c79f 100644 --- a/src/imports/resolveLibrary.spec.ts +++ b/src/imports/resolveLibrary.spec.ts @@ -1,4 +1,4 @@ -import { createVirtualFileSystem } from "../vfs/createVirtualFileSystem"; +import { createVirtualFileSystem } from "../020-vfs/createVirtualFileSystem"; import { resolveLibrary } from "./resolveLibrary"; describe("resolveLibrary", () => { diff --git a/src/imports/resolveLibrary.ts b/src/imports/resolveLibrary.ts index dbd5cf400..7a605449b 100644 --- a/src/imports/resolveLibrary.ts +++ b/src/imports/resolveLibrary.ts @@ -1,4 +1,4 @@ -import { VirtualFileSystem } from "../vfs/VirtualFileSystem"; +import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; import { parseImportPath } from "./parseImportPath"; type ResolveLibraryArgs = { diff --git a/src/main.ts b/src/main.ts index 1cb69145d..fb6e25c9f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,9 +9,9 @@ export { PackageFileFormat } from "./packaging/fileFormat"; export { build } from "./010-pipeline/build"; -export { VirtualFileSystem } from "./vfs/VirtualFileSystem"; +export { VirtualFileSystem } from "./020-vfs/VirtualFileSystem"; -export { createVirtualFileSystem } from "./vfs/createVirtualFileSystem"; +export { createVirtualFileSystem } from "./020-vfs/createVirtualFileSystem"; export * from "./browser"; export * from "./verify"; diff --git a/src/node.ts b/src/node.ts index a948c8ef4..1005533df 100644 --- a/src/node.ts +++ b/src/node.ts @@ -1,7 +1,7 @@ import path from "path"; import fs from "fs"; import { ConfigProject, Config, parseConfig } from "./000-config/parseConfig"; -import { createNodeFileSystem } from "./vfs/createNodeFileSystem"; +import { createNodeFileSystem } from "./020-vfs/createNodeFileSystem"; import { build } from "./010-pipeline/build"; import { LogLevel, Logger } from "./010-pipeline/logger"; import { TactErrorCollection } from "./error/errors"; @@ -141,6 +141,6 @@ export async function run(args: { return { ok: success, error: errorMessages }; } -export { createNodeFileSystem } from "./vfs/createNodeFileSystem"; +export { createNodeFileSystem } from "./020-vfs/createNodeFileSystem"; export { parseAndEvalExpression } from "./interpreter/interpreter"; From c73f7cfd8b88189d93bb5924f431a533c633f16b Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:31:05 +0400 Subject: [PATCH 07/26] move errors --- src/010-pipeline/build.ts | 2 +- src/{error => 030-error}/display-to-json.ts | 0 src/{error => 030-error}/display-to-string.ts | 0 src/{error => 030-error}/display.ts | 0 src/{error => 030-error}/errors.ts | 0 src/abi/global.ts | 2 +- src/abi/map.ts | 2 +- src/abi/struct.ts | 2 +- src/bindings/typescript/serializers.ts | 2 +- src/bindings/typescript/writeStruct.ts | 2 +- src/bindings/writeTypescript.ts | 2 +- src/generator/writers/writeExpression.ts | 2 +- src/generator/writers/writeFunction.ts | 2 +- src/generator/writers/writeSerialization.ts | 2 +- src/grammar/clone.ts | 2 +- src/grammar/compare.ts | 2 +- src/grammar/hash.ts | 2 +- src/grammar/next/index.ts | 4 ++-- src/grammar/parser-error.ts | 2 +- src/grammar/prev/grammar.ts | 4 ++-- src/grammar/prev/parser-error.ts | 4 ++-- src/grammar/sort.ts | 2 +- src/grammar/src-info.ts | 2 +- src/grammar/store.ts | 2 +- src/imports/resolveImports.ts | 2 +- src/index.ts | 2 +- src/interpreter/constEval.ts | 2 +- src/interpreter/interpreter.ts | 2 +- src/main.ts | 2 +- src/node.ts | 2 +- src/optimizer/util.ts | 2 +- src/storage/allocator.ts | 2 +- src/storage/resolveAllocation.ts | 2 +- src/types/resolveABITypeRef.ts | 2 +- src/types/resolveDescriptors.ts | 2 +- src/types/resolveErrors.ts | 2 +- src/types/resolveExpression.ts | 4 ++-- src/types/resolveSignatures.ts | 4 ++-- src/types/resolveStatements.ts | 2 +- src/types/types.ts | 2 +- src/utils/tricks.ts | 2 +- src/utils/utils.ts | 2 +- 42 files changed, 43 insertions(+), 43 deletions(-) rename src/{error => 030-error}/display-to-json.ts (100%) rename src/{error => 030-error}/display-to-string.ts (100%) rename src/{error => 030-error}/display.ts (100%) rename src/{error => 030-error}/errors.ts (100%) diff --git a/src/010-pipeline/build.ts b/src/010-pipeline/build.ts index 897568922..ea7576d96 100644 --- a/src/010-pipeline/build.ts +++ b/src/010-pipeline/build.ts @@ -20,7 +20,7 @@ import { compile } from "./compile"; import { precompile } from "./precompile"; import { getCompilerVersion } from "./version"; import { FactoryAst, getAstFactory, idText } from "../grammar/ast"; -import { TactErrorCollection } from "../error/errors"; +import { TactErrorCollection } from "../030-error/errors"; import { getParser, Parser } from "../grammar"; import { defaultParser } from "../grammar/grammar"; diff --git a/src/error/display-to-json.ts b/src/030-error/display-to-json.ts similarity index 100% rename from src/error/display-to-json.ts rename to src/030-error/display-to-json.ts diff --git a/src/error/display-to-string.ts b/src/030-error/display-to-string.ts similarity index 100% rename from src/error/display-to-string.ts rename to src/030-error/display-to-string.ts diff --git a/src/error/display.ts b/src/030-error/display.ts similarity index 100% rename from src/error/display.ts rename to src/030-error/display.ts diff --git a/src/error/errors.ts b/src/030-error/errors.ts similarity index 100% rename from src/error/errors.ts rename to src/030-error/errors.ts diff --git a/src/abi/global.ts b/src/abi/global.ts index 4bd19256b..100594f2e 100644 --- a/src/abi/global.ts +++ b/src/abi/global.ts @@ -9,7 +9,7 @@ import { writeExpression, writeValue, } from "../generator/writers/writeExpression"; -import { TactConstEvalError, throwCompilationError } from "../error/errors"; +import { TactConstEvalError, throwCompilationError } from "../030-error/errors"; import { evalConstantExpression } from "../interpreter/constEval"; import { getErrorId } from "../types/resolveErrors"; import { AbiFunction } from "./AbiFunction"; diff --git a/src/abi/map.ts b/src/abi/map.ts index caf890cba..5da7e1f07 100644 --- a/src/abi/map.ts +++ b/src/abi/map.ts @@ -4,7 +4,7 @@ import { TypeRef } from "../types/types"; import { WriterContext } from "../generator/Writer"; import { ops } from "../generator/writers/ops"; import { writeExpression } from "../generator/writers/writeExpression"; -import { throwCompilationError } from "../error/errors"; +import { throwCompilationError } from "../030-error/errors"; import { getType } from "../types/resolveDescriptors"; import { AbiFunction } from "./AbiFunction"; import { AstExpression } from "../grammar/ast"; diff --git a/src/abi/struct.ts b/src/abi/struct.ts index 541dba8ac..39569793f 100644 --- a/src/abi/struct.ts +++ b/src/abi/struct.ts @@ -1,6 +1,6 @@ import { ops } from "../generator/writers/ops"; import { writeExpression } from "../generator/writers/writeExpression"; -import { throwCompilationError } from "../error/errors"; +import { throwCompilationError } from "../030-error/errors"; import { getType } from "../types/resolveDescriptors"; import { AbiFunction } from "./AbiFunction"; diff --git a/src/bindings/typescript/serializers.ts b/src/bindings/typescript/serializers.ts index ab8bbf3b5..4770d87dd 100644 --- a/src/bindings/typescript/serializers.ts +++ b/src/bindings/typescript/serializers.ts @@ -1,6 +1,6 @@ import { ABITypeRef } from "@ton/core"; import { Writer } from "../../utils/Writer"; -import { throwInternalCompilerError } from "../../error/errors"; +import { throwInternalCompilerError } from "../../030-error/errors"; const primitiveTypes = [ "int", diff --git a/src/bindings/typescript/writeStruct.ts b/src/bindings/typescript/writeStruct.ts index 5c7f2c766..0f5945632 100644 --- a/src/bindings/typescript/writeStruct.ts +++ b/src/bindings/typescript/writeStruct.ts @@ -1,7 +1,7 @@ import { ABIType, ABITypeRef } from "@ton/core"; import { serializers } from "./serializers"; import { AllocationCell, AllocationOperation } from "../../storage/operation"; -import { throwInternalCompilerError } from "../../error/errors"; +import { throwInternalCompilerError } from "../../030-error/errors"; import { Writer } from "../../utils/Writer"; export const maxTupleSize = 15; diff --git a/src/bindings/writeTypescript.ts b/src/bindings/writeTypescript.ts index cdd5668ca..ab934b795 100644 --- a/src/bindings/writeTypescript.ts +++ b/src/bindings/writeTypescript.ts @@ -14,7 +14,7 @@ import { writeTupleSerializer, } from "./typescript/writeStruct"; import { AllocationCell } from "../storage/operation"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; import { topologicalSort } from "../utils/utils"; import { allocate, diff --git a/src/generator/writers/writeExpression.ts b/src/generator/writers/writeExpression.ts index f951d7990..68a136420 100644 --- a/src/generator/writers/writeExpression.ts +++ b/src/generator/writers/writeExpression.ts @@ -9,7 +9,7 @@ import { idTextErr, TactConstEvalError, throwCompilationError, -} from "../../error/errors"; +} from "../../030-error/errors"; import { getExpType } from "../../types/resolveExpression"; import { getStaticConstant, diff --git a/src/generator/writers/writeFunction.ts b/src/generator/writers/writeFunction.ts index af79d3637..0c8a43ebf 100644 --- a/src/generator/writers/writeFunction.ts +++ b/src/generator/writers/writeFunction.ts @@ -22,7 +22,7 @@ import { cast } from "./cast"; import { resolveFuncTupleType } from "./resolveFuncTupleType"; import { ops } from "./ops"; import { freshIdentifier } from "./freshIdentifier"; -import { idTextErr, throwInternalCompilerError } from "../../error/errors"; +import { idTextErr, throwInternalCompilerError } from "../../030-error/errors"; import { ppAsmShuffle } from "../../prettyPrinter"; export function writeCastedExpression( diff --git a/src/generator/writers/writeSerialization.ts b/src/generator/writers/writeSerialization.ts index 592345cea..3b8223b4a 100644 --- a/src/generator/writers/writeSerialization.ts +++ b/src/generator/writers/writeSerialization.ts @@ -1,5 +1,5 @@ import { contractErrors } from "../../abi/errors"; -import { throwInternalCompilerError } from "../../error/errors"; +import { throwInternalCompilerError } from "../../030-error/errors"; import { dummySrcInfo, ItemOrigin } from "../../grammar"; import { AllocationCell, AllocationOperation } from "../../storage/operation"; import { StorageAllocation } from "../../storage/StorageAllocation"; diff --git a/src/grammar/clone.ts b/src/grammar/clone.ts index 31b92d1fe..d9d114f17 100644 --- a/src/grammar/clone.ts +++ b/src/grammar/clone.ts @@ -1,5 +1,5 @@ import { AstNode, FactoryAst } from "./ast"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; export function cloneNode( src: T, diff --git a/src/grammar/compare.ts b/src/grammar/compare.ts index 918d3bd95..4fe3b7428 100644 --- a/src/grammar/compare.ts +++ b/src/grammar/compare.ts @@ -56,7 +56,7 @@ import { AstStatementDestruct, } from "./ast"; import { AstRenamer } from "./rename"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; import JSONbig from "json-bigint"; /** diff --git a/src/grammar/hash.ts b/src/grammar/hash.ts index 354f22431..b7da0770a 100644 --- a/src/grammar/hash.ts +++ b/src/grammar/hash.ts @@ -26,7 +26,7 @@ import { AstAsmInstruction, } from "./ast"; import { createHash } from "crypto"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; import JSONbig from "json-bigint"; export type AstHash = string; diff --git a/src/grammar/next/index.ts b/src/grammar/next/index.ts index 68ac14ee0..c7e8946fa 100644 --- a/src/grammar/next/index.ts +++ b/src/grammar/next/index.ts @@ -2,11 +2,11 @@ import * as $ from "@tonstudio/parser-runtime"; import * as A from "../ast"; import * as G from "./grammar"; import type { $ast } from "./grammar"; -import { TactCompilationError, throwInternalCompilerError } from "../../error/errors"; +import { TactCompilationError, throwInternalCompilerError } from "../../030-error/errors"; import { SyntaxErrors, syntaxErrorSchema } from "../parser-error"; import { AstSchema, getAstSchema } from "../ast-typed"; import { getSrcInfo, ItemOrigin } from "../src-info"; -import { displayToString } from "../../error/display-to-string"; +import { displayToString } from "../../030-error/display-to-string"; import { makeMakeVisitor } from "../../utils/tricks"; const makeVisitor = makeMakeVisitor("$"); diff --git a/src/grammar/parser-error.ts b/src/grammar/parser-error.ts index ebd73847f..43327acef 100644 --- a/src/grammar/parser-error.ts +++ b/src/grammar/parser-error.ts @@ -1,4 +1,4 @@ -import { ErrorDisplay } from "../error/display"; +import { ErrorDisplay } from "../030-error/display"; const attributeSchema = (name: string) => diff --git a/src/grammar/prev/grammar.ts b/src/grammar/prev/grammar.ts index 4951d5c62..8b5bc0050 100644 --- a/src/grammar/prev/grammar.ts +++ b/src/grammar/prev/grammar.ts @@ -1,6 +1,6 @@ import { Node, IterationNode, NonterminalNode } from "ohm-js"; import tactGrammar from "./grammar.ohm-bundle"; -import { throwInternalCompilerError } from "../../error/errors"; +import { throwInternalCompilerError } from "../../030-error/errors"; import { AstAugmentedAssignOperation, AstConstantAttribute, @@ -19,7 +19,7 @@ import { FactoryAst, } from "../ast"; import { ItemOrigin, SrcInfo } from "../src-info"; -import { displayToString } from "../../error/display-to-string"; +import { displayToString } from "../../030-error/display-to-string"; import { ParserErrors, parserErrorSchema } from "./parser-error"; import { getSrcInfoFromOhm } from "./src-info"; diff --git a/src/grammar/prev/parser-error.ts b/src/grammar/prev/parser-error.ts index fd40d493a..8c0709003 100644 --- a/src/grammar/prev/parser-error.ts +++ b/src/grammar/prev/parser-error.ts @@ -1,6 +1,6 @@ import { MatchResult } from "ohm-js"; -import { ErrorDisplay } from "../../error/display"; -import { TactCompilationError } from "../../error/errors"; +import { ErrorDisplay } from "../../030-error/display"; +import { TactCompilationError } from "../../030-error/errors"; import { syntaxErrorSchema } from "../parser-error"; import { ItemOrigin, SrcInfo } from "../src-info"; import { getSrcInfoFromOhm } from "./src-info"; diff --git a/src/grammar/sort.ts b/src/grammar/sort.ts index a924702c6..3ae3eccce 100644 --- a/src/grammar/sort.ts +++ b/src/grammar/sort.ts @@ -5,7 +5,7 @@ import { AstContractAttribute, AstNode, } from "./ast"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; /** * Provides utilities to sort lists of AST nodes. diff --git a/src/grammar/src-info.ts b/src/grammar/src-info.ts index feb3941a2..6e5747db7 100644 --- a/src/grammar/src-info.ts +++ b/src/grammar/src-info.ts @@ -1,4 +1,4 @@ -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; export type ItemOrigin = "stdlib" | "user"; diff --git a/src/grammar/store.ts b/src/grammar/store.ts index 40868c51b..301a65198 100644 --- a/src/grammar/store.ts +++ b/src/grammar/store.ts @@ -6,7 +6,7 @@ import { AstTypeDecl, AstAsmFunctionDef, } from "./ast"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; import { CompilerContext, createContextStore } from "../010-pipeline/context"; import { ItemOrigin } from "./src-info"; import { Parser } from "./grammar"; diff --git a/src/imports/resolveImports.ts b/src/imports/resolveImports.ts index 5a81da5bc..278c58153 100644 --- a/src/imports/resolveImports.ts +++ b/src/imports/resolveImports.ts @@ -1,6 +1,6 @@ import { ItemOrigin, Parser } from "../grammar"; import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; -import { throwCompilationError } from "../error/errors"; +import { throwCompilationError } from "../030-error/errors"; import { resolveLibrary } from "./resolveLibrary"; export function resolveImports(args: { diff --git a/src/index.ts b/src/index.ts index ff527457b..591f88bc4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ export { TactInternalCompilerError, TactConstEvalError, TactErrorCollection, -} from "./error/errors"; +} from "./030-error/errors"; export { optionsSchema, projectSchema, diff --git a/src/interpreter/constEval.ts b/src/interpreter/constEval.ts index 4e4bb24d5..fc50f9526 100644 --- a/src/interpreter/constEval.ts +++ b/src/interpreter/constEval.ts @@ -6,7 +6,7 @@ import { AstValue, isValue, } from "../grammar/ast"; -import { TactConstEvalError } from "../error/errors"; +import { TactConstEvalError } from "../030-error/errors"; import { Value } from "../types/types"; import { AstUtil, extractValue } from "../optimizer/util"; import { ExpressionTransformer } from "../optimizer/types"; diff --git a/src/interpreter/interpreter.ts b/src/interpreter/interpreter.ts index 93a8f995e..8aac4dcf4 100644 --- a/src/interpreter/interpreter.ts +++ b/src/interpreter/interpreter.ts @@ -9,7 +9,7 @@ import { idTextErr, throwConstEvalError, throwInternalCompilerError, -} from "../error/errors"; +} from "../030-error/errors"; import { AstBinaryOperation, AstBoolean, diff --git a/src/main.ts b/src/main.ts index fb6e25c9f..2fb579ec4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -16,4 +16,4 @@ export { createVirtualFileSystem } from "./020-vfs/createVirtualFileSystem"; export * from "./browser"; export * from "./verify"; export * from "./010-pipeline/logger"; -export * from "./error/errors"; +export * from "./030-error/errors"; diff --git a/src/node.ts b/src/node.ts index 1005533df..5570cf489 100644 --- a/src/node.ts +++ b/src/node.ts @@ -4,7 +4,7 @@ import { ConfigProject, Config, parseConfig } from "./000-config/parseConfig"; import { createNodeFileSystem } from "./020-vfs/createNodeFileSystem"; import { build } from "./010-pipeline/build"; import { LogLevel, Logger } from "./010-pipeline/logger"; -import { TactErrorCollection } from "./error/errors"; +import { TactErrorCollection } from "./030-error/errors"; type AdditionalCliOptions = { mode?: ConfigProject["mode"]; diff --git a/src/optimizer/util.ts b/src/optimizer/util.ts index 9c158e35b..0bfa18442 100644 --- a/src/optimizer/util.ts +++ b/src/optimizer/util.ts @@ -7,7 +7,7 @@ import { FactoryAst, } from "../grammar/ast"; import { dummySrcInfo } from "../grammar"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; import { Value } from "../types/types"; export function extractValue(ast: AstValue): Value { diff --git a/src/storage/allocator.ts b/src/storage/allocator.ts index 2d388073e..fe34d9dd5 100644 --- a/src/storage/allocator.ts +++ b/src/storage/allocator.ts @@ -4,7 +4,7 @@ import { AllocationOperation, AllocationOperationType, } from "./operation"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; const ALLOCATOR_RESERVE_BIT = 1; const ALLOCATOR_RESERVE_REF = 1; diff --git a/src/storage/resolveAllocation.ts b/src/storage/resolveAllocation.ts index 6acd7a33e..1aaf2da99 100644 --- a/src/storage/resolveAllocation.ts +++ b/src/storage/resolveAllocation.ts @@ -7,7 +7,7 @@ import { AllocationOperation } from "./operation"; import { allocate, getAllocationOperationFromField } from "./allocator"; import { createABITypeRefFromTypeRef } from "../types/resolveABITypeRef"; import { funcInitIdOf } from "../generator/writers/id"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; import { idText } from "../grammar/ast"; const store = createContextStore(); diff --git a/src/types/resolveABITypeRef.ts b/src/types/resolveABITypeRef.ts index 61a010899..ce4e7b12f 100644 --- a/src/types/resolveABITypeRef.ts +++ b/src/types/resolveABITypeRef.ts @@ -17,7 +17,7 @@ import { idTextErr, throwCompilationError, throwInternalCompilerError, -} from "../error/errors"; +} from "../030-error/errors"; import { TypeRef } from "./types"; import { CompilerContext } from "../010-pipeline/context"; import { getType } from "./resolveDescriptors"; diff --git a/src/types/resolveDescriptors.ts b/src/types/resolveDescriptors.ts index 840caeb32..12acccb91 100644 --- a/src/types/resolveDescriptors.ts +++ b/src/types/resolveDescriptors.ts @@ -24,7 +24,7 @@ import { idTextErr, throwCompilationError, throwInternalCompilerError, -} from "../error/errors"; +} from "../030-error/errors"; import { CompilerContext, Store, createContextStore } from "../010-pipeline/context"; import { ConstantDescription, diff --git a/src/types/resolveErrors.ts b/src/types/resolveErrors.ts index b01b0e343..fe81981ad 100644 --- a/src/types/resolveErrors.ts +++ b/src/types/resolveErrors.ts @@ -3,7 +3,7 @@ import { CompilerContext, createContextStore } from "../010-pipeline/context"; import { AstNode, isRequire } from "../grammar/ast"; import { traverse } from "../grammar/iterators"; import { evalConstantExpression } from "../interpreter/constEval"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; import { getAllStaticFunctions, getAllTypes, diff --git a/src/types/resolveExpression.ts b/src/types/resolveExpression.ts index 7fc658e09..04efabd21 100644 --- a/src/types/resolveExpression.ts +++ b/src/types/resolveExpression.ts @@ -16,7 +16,7 @@ import { idText, isWildcard, } from "../grammar/ast"; -import { idTextErr, throwCompilationError } from "../error/errors"; +import { idTextErr, throwCompilationError } from "../030-error/errors"; import { CompilerContext, createContextStore } from "../010-pipeline/context"; import { getAllTypes, @@ -31,7 +31,7 @@ import { StatementContext } from "./resolveStatements"; import { MapFunctions } from "../abi/map"; import { GlobalFunctions } from "../abi/global"; import { isAssignable, moreGeneralType } from "./subtyping"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; import { StructFunctions } from "../abi/struct"; import { prettyPrint } from "../prettyPrinter"; diff --git a/src/types/resolveSignatures.ts b/src/types/resolveSignatures.ts index 5429000fc..f26bf9cad 100644 --- a/src/types/resolveSignatures.ts +++ b/src/types/resolveSignatures.ts @@ -6,14 +6,14 @@ import { idTextErr, throwConstEvalError, throwInternalCompilerError, -} from "../error/errors"; +} from "../030-error/errors"; import { getType, getAllTypes } from "./resolveDescriptors"; import { BinaryReceiverSelector, CommentReceiverSelector, ReceiverDescription, } from "./types"; -import { throwCompilationError } from "../error/errors"; +import { throwCompilationError } from "../030-error/errors"; import { AstNumber, AstReceiver } from "../grammar/ast"; import { commentPseudoOpcode } from "../generator/writers/writeRouter"; import { sha256_sync } from "@ton/crypto"; diff --git a/src/types/resolveStatements.ts b/src/types/resolveStatements.ts index 865354fd2..2ef722c09 100644 --- a/src/types/resolveStatements.ts +++ b/src/types/resolveStatements.ts @@ -16,7 +16,7 @@ import { throwCompilationError, throwConstEvalError, throwInternalCompilerError, -} from "../error/errors"; +} from "../030-error/errors"; import { getAllStaticFunctions, getStaticConstant, diff --git a/src/types/types.ts b/src/types/types.ts index 6029c6b58..c1957e742 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,5 +1,5 @@ import { ABIField, Address, Cell, Slice } from "@ton/core"; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; import { AstConstantDef, AstFunctionDef, diff --git a/src/utils/tricks.ts b/src/utils/tricks.ts index 1d81f566e..22ee2482a 100644 --- a/src/utils/tricks.ts +++ b/src/utils/tricks.ts @@ -89,7 +89,7 @@ export const match = ( }) as MV, never>; }; -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; /** * Convert union to intersection. See https://stackoverflow.com/q/50374908 diff --git a/src/utils/utils.ts b/src/utils/utils.ts index c5cd373a6..af311c362 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -1,4 +1,4 @@ -import { throwInternalCompilerError } from "../error/errors"; +import { throwInternalCompilerError } from "../030-error/errors"; export function topologicalSort(src: T[], references: (src: T) => T[]) { const result: T[] = []; From cd32c8b07b5ecfa2b86f0be9f15e19f5d98282eb Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:32:12 +0400 Subject: [PATCH 08/26] move imports --- src/010-pipeline/build.ts | 2 +- src/010-pipeline/precompile.ts | 2 +- src/{imports => 040-imports}/__testdata/project/imported.tact | 0 .../__testdata/project/imported_from_subfolder.tact | 0 src/{imports => 040-imports}/__testdata/project/main.tact | 0 .../__testdata/project/subfolder/import_from_parent.tact | 0 src/{imports => 040-imports}/__testdata/stdlib/lib/config.tact | 0 .../__testdata/stdlib/lib/config/import2.tact | 0 src/{imports => 040-imports}/__testdata/stdlib/stdlib.fc | 0 src/{imports => 040-imports}/__testdata/stdlib/stdlib.tact | 0 src/{imports => 040-imports}/__testdata/stdlib/stdlib2.fc | 0 src/{imports => 040-imports}/parseImportPath.spec.ts | 0 src/{imports => 040-imports}/parseImportPath.ts | 0 src/{imports => 040-imports}/resolveImports.spec.ts | 0 src/{imports => 040-imports}/resolveImports.ts | 0 src/{imports => 040-imports}/resolveLibrary.spec.ts | 0 src/{imports => 040-imports}/resolveLibrary.ts | 0 src/{imports => 040-imports}/stdlib.ts | 0 src/func/funcCompile.spec.ts | 2 +- 19 files changed, 3 insertions(+), 3 deletions(-) rename src/{imports => 040-imports}/__testdata/project/imported.tact (100%) rename src/{imports => 040-imports}/__testdata/project/imported_from_subfolder.tact (100%) rename src/{imports => 040-imports}/__testdata/project/main.tact (100%) rename src/{imports => 040-imports}/__testdata/project/subfolder/import_from_parent.tact (100%) rename src/{imports => 040-imports}/__testdata/stdlib/lib/config.tact (100%) rename src/{imports => 040-imports}/__testdata/stdlib/lib/config/import2.tact (100%) rename src/{imports => 040-imports}/__testdata/stdlib/stdlib.fc (100%) rename src/{imports => 040-imports}/__testdata/stdlib/stdlib.tact (100%) rename src/{imports => 040-imports}/__testdata/stdlib/stdlib2.fc (100%) rename src/{imports => 040-imports}/parseImportPath.spec.ts (100%) rename src/{imports => 040-imports}/parseImportPath.ts (100%) rename src/{imports => 040-imports}/resolveImports.spec.ts (100%) rename src/{imports => 040-imports}/resolveImports.ts (100%) rename src/{imports => 040-imports}/resolveLibrary.spec.ts (100%) rename src/{imports => 040-imports}/resolveLibrary.ts (100%) rename src/{imports => 040-imports}/stdlib.ts (100%) diff --git a/src/010-pipeline/build.ts b/src/010-pipeline/build.ts index ea7576d96..3c041cbcb 100644 --- a/src/010-pipeline/build.ts +++ b/src/010-pipeline/build.ts @@ -7,7 +7,7 @@ import { CompilerContext } from "./context"; import { funcCompile } from "../func/funcCompile"; import { writeReport } from "../generator/writeReport"; import { getRawAST } from "../grammar/store"; -import files from "../imports/stdlib"; +import files from "../040-imports/stdlib"; import { ILogger, Logger } from "./logger"; import { PackageFileFormat } from "../packaging/fileFormat"; import { packageCode } from "../packaging/packageCode"; diff --git a/src/010-pipeline/precompile.ts b/src/010-pipeline/precompile.ts index 3186e7b02..193c4817d 100644 --- a/src/010-pipeline/precompile.ts +++ b/src/010-pipeline/precompile.ts @@ -5,7 +5,7 @@ import { openContext } from "../grammar/store"; import { resolveStatements } from "../types/resolveStatements"; import { resolveErrors } from "../types/resolveErrors"; import { resolveSignatures } from "../types/resolveSignatures"; -import { resolveImports } from "../imports/resolveImports"; +import { resolveImports } from "../040-imports/resolveImports"; import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; import { AstModule, FactoryAst } from "../grammar/ast"; import { Parser } from "../grammar"; diff --git a/src/imports/__testdata/project/imported.tact b/src/040-imports/__testdata/project/imported.tact similarity index 100% rename from src/imports/__testdata/project/imported.tact rename to src/040-imports/__testdata/project/imported.tact diff --git a/src/imports/__testdata/project/imported_from_subfolder.tact b/src/040-imports/__testdata/project/imported_from_subfolder.tact similarity index 100% rename from src/imports/__testdata/project/imported_from_subfolder.tact rename to src/040-imports/__testdata/project/imported_from_subfolder.tact diff --git a/src/imports/__testdata/project/main.tact b/src/040-imports/__testdata/project/main.tact similarity index 100% rename from src/imports/__testdata/project/main.tact rename to src/040-imports/__testdata/project/main.tact diff --git a/src/imports/__testdata/project/subfolder/import_from_parent.tact b/src/040-imports/__testdata/project/subfolder/import_from_parent.tact similarity index 100% rename from src/imports/__testdata/project/subfolder/import_from_parent.tact rename to src/040-imports/__testdata/project/subfolder/import_from_parent.tact diff --git a/src/imports/__testdata/stdlib/lib/config.tact b/src/040-imports/__testdata/stdlib/lib/config.tact similarity index 100% rename from src/imports/__testdata/stdlib/lib/config.tact rename to src/040-imports/__testdata/stdlib/lib/config.tact diff --git a/src/imports/__testdata/stdlib/lib/config/import2.tact b/src/040-imports/__testdata/stdlib/lib/config/import2.tact similarity index 100% rename from src/imports/__testdata/stdlib/lib/config/import2.tact rename to src/040-imports/__testdata/stdlib/lib/config/import2.tact diff --git a/src/imports/__testdata/stdlib/stdlib.fc b/src/040-imports/__testdata/stdlib/stdlib.fc similarity index 100% rename from src/imports/__testdata/stdlib/stdlib.fc rename to src/040-imports/__testdata/stdlib/stdlib.fc diff --git a/src/imports/__testdata/stdlib/stdlib.tact b/src/040-imports/__testdata/stdlib/stdlib.tact similarity index 100% rename from src/imports/__testdata/stdlib/stdlib.tact rename to src/040-imports/__testdata/stdlib/stdlib.tact diff --git a/src/imports/__testdata/stdlib/stdlib2.fc b/src/040-imports/__testdata/stdlib/stdlib2.fc similarity index 100% rename from src/imports/__testdata/stdlib/stdlib2.fc rename to src/040-imports/__testdata/stdlib/stdlib2.fc diff --git a/src/imports/parseImportPath.spec.ts b/src/040-imports/parseImportPath.spec.ts similarity index 100% rename from src/imports/parseImportPath.spec.ts rename to src/040-imports/parseImportPath.spec.ts diff --git a/src/imports/parseImportPath.ts b/src/040-imports/parseImportPath.ts similarity index 100% rename from src/imports/parseImportPath.ts rename to src/040-imports/parseImportPath.ts diff --git a/src/imports/resolveImports.spec.ts b/src/040-imports/resolveImports.spec.ts similarity index 100% rename from src/imports/resolveImports.spec.ts rename to src/040-imports/resolveImports.spec.ts diff --git a/src/imports/resolveImports.ts b/src/040-imports/resolveImports.ts similarity index 100% rename from src/imports/resolveImports.ts rename to src/040-imports/resolveImports.ts diff --git a/src/imports/resolveLibrary.spec.ts b/src/040-imports/resolveLibrary.spec.ts similarity index 100% rename from src/imports/resolveLibrary.spec.ts rename to src/040-imports/resolveLibrary.spec.ts diff --git a/src/imports/resolveLibrary.ts b/src/040-imports/resolveLibrary.ts similarity index 100% rename from src/imports/resolveLibrary.ts rename to src/040-imports/resolveLibrary.ts diff --git a/src/imports/stdlib.ts b/src/040-imports/stdlib.ts similarity index 100% rename from src/imports/stdlib.ts rename to src/040-imports/stdlib.ts diff --git a/src/func/funcCompile.spec.ts b/src/func/funcCompile.spec.ts index e1774d2c7..80ebb81b4 100644 --- a/src/func/funcCompile.spec.ts +++ b/src/func/funcCompile.spec.ts @@ -2,7 +2,7 @@ import fs from "fs"; import path from "path"; import { Logger } from "../010-pipeline/logger"; import { funcCompile } from "./funcCompile"; -import files from "../imports/stdlib"; +import files from "../040-imports/stdlib"; describe("funcCompile", () => { it("should compile small contract", async () => { From a60a3572c52dd17bf9188acec90463fcf33696f1 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:36:17 +0400 Subject: [PATCH 09/26] move grammar --- .prettierignore | 6 +++--- CONTRIBUTING.md | 8 ++++---- STYLEGUIDE.md | 2 +- cspell.json | 14 +++++++------- knip.json | 6 +++--- package.json | 4 ++-- src/010-pipeline/build.ts | 8 ++++---- src/010-pipeline/precompile.ts | 6 +++--- src/030-error/display-to-json.ts | 4 ++-- src/030-error/display.ts | 2 +- src/030-error/errors.ts | 4 ++-- src/040-imports/resolveImports.spec.ts | 6 +++--- src/040-imports/resolveImports.ts | 2 +- src/{grammar => 050-grammar}/ast-typed.ts | 0 src/{grammar => 050-grammar}/ast.ts | 0 src/{grammar => 050-grammar}/clone.ts | 0 src/{grammar => 050-grammar}/compare.ts | 0 src/{grammar => 050-grammar}/grammar.ts | 0 src/{grammar => 050-grammar}/hash.ts | 0 src/{grammar => 050-grammar}/index.ts | 0 src/{grammar => 050-grammar}/iterators.ts | 0 .../next/__snapshots__/grammar.spec.ts.snap | 0 src/{grammar => 050-grammar}/next/grammar.gg | 0 src/{grammar => 050-grammar}/next/grammar.spec.ts | 0 src/{grammar => 050-grammar}/next/grammar.ts | 0 src/{grammar => 050-grammar}/next/index.ts | 0 src/{grammar => 050-grammar}/parser-error.ts | 0 .../prev/__snapshots__/grammar.spec.ts.snap | 0 src/{grammar => 050-grammar}/prev/grammar.ohm | 0 src/{grammar => 050-grammar}/prev/grammar.spec.ts | 0 src/{grammar => 050-grammar}/prev/grammar.ts | 0 src/{grammar => 050-grammar}/prev/parser-error.ts | 0 src/{grammar => 050-grammar}/prev/src-info.ts | 0 src/{grammar => 050-grammar}/rename.ts | 0 src/{grammar => 050-grammar}/sort.ts | 0 src/{grammar => 050-grammar}/src-info.ts | 0 src/{grammar => 050-grammar}/store.ts | 0 .../abstract-const-without-modifier.tact | 0 .../test-failed/const-abstract-abstract.tact | 0 .../test-failed/const-override-override.tact | 0 .../test-failed/const-override-virtual.tact | 0 .../test-failed/const-override.tact | 0 .../test-failed/const-virtual-override.tact | 0 .../test-failed/const-virtual-virtual.tact | 0 .../test-failed/const-virtual.tact | 0 .../contract-const-abstract-abstract.tact | 0 .../contract-const-abstract-with-initializer.tact | 0 .../test-failed/contract-const-abstract.tact | 0 .../contract-const-override-override.tact | 0 .../contract-const-virtual-virtual.tact | 0 .../contract-empty-traits-list-with-keyword.tact | 0 .../contract-getter-parens-no-method-id.tact | 0 .../contract-init-trailing-comma-empty-params.tact | 0 .../contract-trailing-comma-empty-traits-list.tact | 0 .../test-failed/contract-with-imports.tact | 0 .../destructuring-duplicate-source-id.tact | 0 .../expr-fun-call-trailing-comma-no-args.tact | 0 .../expr-method-call-trailing-comma-no-args.tact | 0 .../funcid-native-fun-arith-operator.tact | 0 .../funcid-native-fun-assign-operator.tact | 0 .../funcid-native-fun-bitwise-operator.tact | 0 .../test-failed/funcid-native-fun-comma.tact | 0 .../funcid-native-fun-comparison-operator.tact | 0 .../funcid-native-fun-control-keyword.tact | 0 .../test-failed/funcid-native-fun-delimiter.tact | 0 .../test-failed/funcid-native-fun-directive.tact | 0 .../test-failed/funcid-native-fun-dot.tact | 0 .../test-failed/funcid-native-fun-keyword.tact | 0 .../funcid-native-fun-multiline-comments.tact | 0 .../funcid-native-fun-number-decimal.tact | 0 .../funcid-native-fun-number-hexadecimal-2.tact | 0 .../funcid-native-fun-number-hexadecimal.tact | 0 .../funcid-native-fun-number-neg-decimal.tact | 0 .../funcid-native-fun-number-neg-hexadecimal.tact | 0 .../test-failed/funcid-native-fun-number.tact | 0 .../funcid-native-fun-only-underscore.tact | 0 .../test-failed/funcid-native-fun-parens.tact | 0 .../test-failed/funcid-native-fun-semicolons.tact | 0 .../test-failed/funcid-native-fun-space.tact | 0 .../funcid-native-fun-square-brackets.tact | 0 .../test-failed/funcid-native-fun-string.tact | 0 .../funcid-native-fun-type-keyword.tact | 0 .../funcid-native-fun-unclosed-parens.tact | 0 .../ident-cannot-be-if-reserved-word.tact | 0 .../ident-contract-cannot-start-with-__gen.tact | 0 .../ident-fun-cannot-start-with-__gen.tact | 0 .../ident-fun-param-cannot-start-with-__gen.tact | 0 .../ident-fun-param-cannot-start-with-__tact.tact | 0 .../ident-init-param-cannot-start-with-__tact.tact | 0 .../ident-let-cannot-start-with-__gen.tact | 0 .../ident-let-cannot-start-with-__tact.tact | 0 .../ident-struct-cannot-start-with-__gen.tact | 0 ...item-fun-non-void-trailing-comma-no-params.tact | 0 .../item-fun-void-trailing-comma-no-params.tact | 0 .../test-failed/item-fun-without-body.tact | 0 ...fun-not-void-decl-trailing-comma-no-params.tact | 0 ...ive-fun-void-decl-trailing-comma-no-params.tact | 0 .../test-failed/items-asm-fun-1.tact | 0 .../test-failed/items-asm-fun-2.tact | 0 .../test-failed/items-asm-fun-3.tact | 0 .../test-failed/items-asm-fun-4.tact | 0 .../test-failed/items-asm-fun-5.tact | 0 .../literal-dec-trailing-underscore.tact | 0 .../test-failed/literal-double-underscore.tact | 0 .../literal-hex-trailing-underscore.tact | 0 .../literal-no-underscore-after-0b.tact | 0 .../literal-no-underscores-if-leading-zero.tact | 0 .../test-failed/literal-non-binary-digits.tact | 0 .../literal-underscore-after-leading-zero.tact | 0 .../test-failed/struct-double-semicolon.tact | 0 ...-semicolon-between-fields-with-initializer.tact | 0 .../struct-missing-semicolon-between-fields.tact | 0 .../trait-const-abstract-with-initializer.tact | 0 .../trait-empty-traits-list-with-keyword.tact | 0 ...rait-fun-non-void-trailing-comma-no-params.tact | 0 .../trait-fun-void-trailing-comma-no-params.tact | 0 .../trait-trailing-comma-empty-traits-list.tact | 0 .../type-ident-msg-should-be-capitalized.tact | 0 .../type-ident-struct-should-be-capitalized.tact | 0 .../test/abstract-const.tact | 0 src/{grammar => 050-grammar}/test/case-35.tact | 0 .../test/contract-getter-with-method-id.tact | 0 ...ract-optional-semicolon-for-last-const-def.tact | 0 ...ct-optional-semicolon-for-last-storage-var.tact | 0 .../test/contract-with-const-override.tact | 0 .../test/contract-with-imports.tact | 0 .../test/contract-with-init.tact | 0 .../test/contract-with-trait-string-literal.tact | 0 .../test/contract-with-trait.tact | 0 .../test/expr-arith-and-cmp.tact | 0 .../test/expr-arith-bool-cmp-method-call.tact | 0 .../test/expr-arith-bool-var.tact | 0 src/{grammar => 050-grammar}/test/expr-arith.tact | 0 .../test/expr-chaining-unbox.tact | 0 .../test/expr-condition-with-or.tact | 0 .../test/expr-conditional-with-let.tact | 0 .../test/expr-conditional.tact | 0 .../test/expr-equality.spec.ts | 0 .../test/expr-fun-call.tact | 0 .../test/expr-int-literal.tact | 0 .../test/expr-is-value.spec.ts | 0 .../test/expr-nested-conditional.tact | 0 src/{grammar => 050-grammar}/test/expr-parens.tact | 0 .../test/expr-with-unbox.tact | 0 .../test/expr-with-var.tact | 0 .../test/items-asm-funs.tact | 0 ...ms-method-def-initof-trailing-comma-shifts.tact | 0 .../test/items-multi-funs.tact | 0 .../test/items-native-fun-decls.tact | 0 .../test/items-native-fun-funcid.tact | 0 .../test/items-struct-msg-fun-const.tact | 0 .../literals-int-underscores-bin-dec-hex-oct.tact | 0 .../test/stmt-augmented-assign-arith.tact | 0 .../test/stmt-augmented-assign-bitwise.tact | 0 .../test/stmt-augmented-assign-logic.tact | 0 .../test/stmt-destructuring.tact | 0 .../test/stmt-if-else.tact | 0 src/{grammar => 050-grammar}/test/stmt-if.tact | 0 ...stmt-optional-semicolon-for-last-statement.tact | 0 .../test/stmt-while-loop.tact | 0 .../test/stmt-while-repeat-do-loops.tact | 0 .../test/struct-field-punning.tact | 0 .../test/struct-msg-as.tact | 0 .../test/struct-msg-initializers.tact | 0 .../test/struct-msg-trailing-semicolon.tact | 0 ...ait-optional-semicolon-for-last-const-decl.tact | 0 ...trait-optional-semicolon-for-last-fun-decl.tact | 0 .../test/traits-inheritance-trailing-comma.tact | 0 .../test/type-struct-with-map.tact | 0 .../test/types-optional.tact | 0 src/abi/AbiFunction.ts | 4 ++-- src/abi/map.ts | 4 ++-- src/bindings/writeTypescript.ts | 2 +- src/generator/createABI.ts | 2 +- src/generator/writeProgram.ts | 2 +- src/generator/writers/id.ts | 2 +- src/generator/writers/resolveFuncType.spec.ts | 8 ++++---- src/generator/writers/writeAccessors.ts | 2 +- src/generator/writers/writeContract.ts | 2 +- src/generator/writers/writeExpression.spec.ts | 8 ++++---- src/generator/writers/writeExpression.ts | 2 +- src/generator/writers/writeFunction.ts | 2 +- src/generator/writers/writeRouter.ts | 2 +- src/generator/writers/writeSerialization.spec.ts | 8 ++++---- src/generator/writers/writeSerialization.ts | 2 +- src/index.ts | 8 ++++---- src/interpreter/constEval.ts | 4 ++-- src/interpreter/interpreter.ts | 6 +++--- src/optimizer/algebraic.ts | 2 +- src/optimizer/associative.ts | 2 +- src/optimizer/standardOptimizer.ts | 2 +- src/optimizer/test/partial-eval.spec.ts | 6 +++--- src/optimizer/types.ts | 2 +- src/optimizer/util.ts | 4 ++-- src/prettyPrinter.ts | 2 +- src/storage/resolveAllocation.spec.ts | 8 ++++---- src/storage/resolveAllocation.ts | 2 +- src/test/compare.spec.ts | 8 ++++---- src/test/prettyPrinter.spec.ts | 6 +++--- src/test/rename.spec.ts | 8 ++++---- src/types/resolveABITypeRef.ts | 4 ++-- src/types/resolveDescriptors.spec.ts | 10 +++++----- src/types/resolveDescriptors.ts | 10 +++++----- src/types/resolveErrors.ts | 4 ++-- src/types/resolveExpression.ts | 2 +- src/types/resolveSignatures.ts | 4 ++-- src/types/resolveStatements.spec.ts | 8 ++++---- src/types/resolveStatements.ts | 4 ++-- src/types/types.ts | 4 ++-- 209 files changed, 122 insertions(+), 122 deletions(-) rename src/{grammar => 050-grammar}/ast-typed.ts (100%) rename src/{grammar => 050-grammar}/ast.ts (100%) rename src/{grammar => 050-grammar}/clone.ts (100%) rename src/{grammar => 050-grammar}/compare.ts (100%) rename src/{grammar => 050-grammar}/grammar.ts (100%) rename src/{grammar => 050-grammar}/hash.ts (100%) rename src/{grammar => 050-grammar}/index.ts (100%) rename src/{grammar => 050-grammar}/iterators.ts (100%) rename src/{grammar => 050-grammar}/next/__snapshots__/grammar.spec.ts.snap (100%) rename src/{grammar => 050-grammar}/next/grammar.gg (100%) rename src/{grammar => 050-grammar}/next/grammar.spec.ts (100%) rename src/{grammar => 050-grammar}/next/grammar.ts (100%) rename src/{grammar => 050-grammar}/next/index.ts (100%) rename src/{grammar => 050-grammar}/parser-error.ts (100%) rename src/{grammar => 050-grammar}/prev/__snapshots__/grammar.spec.ts.snap (100%) rename src/{grammar => 050-grammar}/prev/grammar.ohm (100%) rename src/{grammar => 050-grammar}/prev/grammar.spec.ts (100%) rename src/{grammar => 050-grammar}/prev/grammar.ts (100%) rename src/{grammar => 050-grammar}/prev/parser-error.ts (100%) rename src/{grammar => 050-grammar}/prev/src-info.ts (100%) rename src/{grammar => 050-grammar}/rename.ts (100%) rename src/{grammar => 050-grammar}/sort.ts (100%) rename src/{grammar => 050-grammar}/src-info.ts (100%) rename src/{grammar => 050-grammar}/store.ts (100%) rename src/{grammar => 050-grammar}/test-failed/abstract-const-without-modifier.tact (100%) rename src/{grammar => 050-grammar}/test-failed/const-abstract-abstract.tact (100%) rename src/{grammar => 050-grammar}/test-failed/const-override-override.tact (100%) rename src/{grammar => 050-grammar}/test-failed/const-override-virtual.tact (100%) rename src/{grammar => 050-grammar}/test-failed/const-override.tact (100%) rename src/{grammar => 050-grammar}/test-failed/const-virtual-override.tact (100%) rename src/{grammar => 050-grammar}/test-failed/const-virtual-virtual.tact (100%) rename src/{grammar => 050-grammar}/test-failed/const-virtual.tact (100%) rename src/{grammar => 050-grammar}/test-failed/contract-const-abstract-abstract.tact (100%) rename src/{grammar => 050-grammar}/test-failed/contract-const-abstract-with-initializer.tact (100%) rename src/{grammar => 050-grammar}/test-failed/contract-const-abstract.tact (100%) rename src/{grammar => 050-grammar}/test-failed/contract-const-override-override.tact (100%) rename src/{grammar => 050-grammar}/test-failed/contract-const-virtual-virtual.tact (100%) rename src/{grammar => 050-grammar}/test-failed/contract-empty-traits-list-with-keyword.tact (100%) rename src/{grammar => 050-grammar}/test-failed/contract-getter-parens-no-method-id.tact (100%) rename src/{grammar => 050-grammar}/test-failed/contract-init-trailing-comma-empty-params.tact (100%) rename src/{grammar => 050-grammar}/test-failed/contract-trailing-comma-empty-traits-list.tact (100%) rename src/{grammar => 050-grammar}/test-failed/contract-with-imports.tact (100%) rename src/{grammar => 050-grammar}/test-failed/destructuring-duplicate-source-id.tact (100%) rename src/{grammar => 050-grammar}/test-failed/expr-fun-call-trailing-comma-no-args.tact (100%) rename src/{grammar => 050-grammar}/test-failed/expr-method-call-trailing-comma-no-args.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-arith-operator.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-assign-operator.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-bitwise-operator.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-comma.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-comparison-operator.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-control-keyword.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-delimiter.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-directive.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-dot.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-keyword.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-multiline-comments.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-number-decimal.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-number-hexadecimal-2.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-number-hexadecimal.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-number-neg-decimal.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-number-neg-hexadecimal.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-number.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-only-underscore.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-parens.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-semicolons.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-space.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-square-brackets.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-string.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-type-keyword.tact (100%) rename src/{grammar => 050-grammar}/test-failed/funcid-native-fun-unclosed-parens.tact (100%) rename src/{grammar => 050-grammar}/test-failed/ident-cannot-be-if-reserved-word.tact (100%) rename src/{grammar => 050-grammar}/test-failed/ident-contract-cannot-start-with-__gen.tact (100%) rename src/{grammar => 050-grammar}/test-failed/ident-fun-cannot-start-with-__gen.tact (100%) rename src/{grammar => 050-grammar}/test-failed/ident-fun-param-cannot-start-with-__gen.tact (100%) rename src/{grammar => 050-grammar}/test-failed/ident-fun-param-cannot-start-with-__tact.tact (100%) rename src/{grammar => 050-grammar}/test-failed/ident-init-param-cannot-start-with-__tact.tact (100%) rename src/{grammar => 050-grammar}/test-failed/ident-let-cannot-start-with-__gen.tact (100%) rename src/{grammar => 050-grammar}/test-failed/ident-let-cannot-start-with-__tact.tact (100%) rename src/{grammar => 050-grammar}/test-failed/ident-struct-cannot-start-with-__gen.tact (100%) rename src/{grammar => 050-grammar}/test-failed/item-fun-non-void-trailing-comma-no-params.tact (100%) rename src/{grammar => 050-grammar}/test-failed/item-fun-void-trailing-comma-no-params.tact (100%) rename src/{grammar => 050-grammar}/test-failed/item-fun-without-body.tact (100%) rename src/{grammar => 050-grammar}/test-failed/item-native-fun-not-void-decl-trailing-comma-no-params.tact (100%) rename src/{grammar => 050-grammar}/test-failed/item-native-fun-void-decl-trailing-comma-no-params.tact (100%) rename src/{grammar => 050-grammar}/test-failed/items-asm-fun-1.tact (100%) rename src/{grammar => 050-grammar}/test-failed/items-asm-fun-2.tact (100%) rename src/{grammar => 050-grammar}/test-failed/items-asm-fun-3.tact (100%) rename src/{grammar => 050-grammar}/test-failed/items-asm-fun-4.tact (100%) rename src/{grammar => 050-grammar}/test-failed/items-asm-fun-5.tact (100%) rename src/{grammar => 050-grammar}/test-failed/literal-dec-trailing-underscore.tact (100%) rename src/{grammar => 050-grammar}/test-failed/literal-double-underscore.tact (100%) rename src/{grammar => 050-grammar}/test-failed/literal-hex-trailing-underscore.tact (100%) rename src/{grammar => 050-grammar}/test-failed/literal-no-underscore-after-0b.tact (100%) rename src/{grammar => 050-grammar}/test-failed/literal-no-underscores-if-leading-zero.tact (100%) rename src/{grammar => 050-grammar}/test-failed/literal-non-binary-digits.tact (100%) rename src/{grammar => 050-grammar}/test-failed/literal-underscore-after-leading-zero.tact (100%) rename src/{grammar => 050-grammar}/test-failed/struct-double-semicolon.tact (100%) rename src/{grammar => 050-grammar}/test-failed/struct-missing-semicolon-between-fields-with-initializer.tact (100%) rename src/{grammar => 050-grammar}/test-failed/struct-missing-semicolon-between-fields.tact (100%) rename src/{grammar => 050-grammar}/test-failed/trait-const-abstract-with-initializer.tact (100%) rename src/{grammar => 050-grammar}/test-failed/trait-empty-traits-list-with-keyword.tact (100%) rename src/{grammar => 050-grammar}/test-failed/trait-fun-non-void-trailing-comma-no-params.tact (100%) rename src/{grammar => 050-grammar}/test-failed/trait-fun-void-trailing-comma-no-params.tact (100%) rename src/{grammar => 050-grammar}/test-failed/trait-trailing-comma-empty-traits-list.tact (100%) rename src/{grammar => 050-grammar}/test-failed/type-ident-msg-should-be-capitalized.tact (100%) rename src/{grammar => 050-grammar}/test-failed/type-ident-struct-should-be-capitalized.tact (100%) rename src/{grammar => 050-grammar}/test/abstract-const.tact (100%) rename src/{grammar => 050-grammar}/test/case-35.tact (100%) rename src/{grammar => 050-grammar}/test/contract-getter-with-method-id.tact (100%) rename src/{grammar => 050-grammar}/test/contract-optional-semicolon-for-last-const-def.tact (100%) rename src/{grammar => 050-grammar}/test/contract-optional-semicolon-for-last-storage-var.tact (100%) rename src/{grammar => 050-grammar}/test/contract-with-const-override.tact (100%) rename src/{grammar => 050-grammar}/test/contract-with-imports.tact (100%) rename src/{grammar => 050-grammar}/test/contract-with-init.tact (100%) rename src/{grammar => 050-grammar}/test/contract-with-trait-string-literal.tact (100%) rename src/{grammar => 050-grammar}/test/contract-with-trait.tact (100%) rename src/{grammar => 050-grammar}/test/expr-arith-and-cmp.tact (100%) rename src/{grammar => 050-grammar}/test/expr-arith-bool-cmp-method-call.tact (100%) rename src/{grammar => 050-grammar}/test/expr-arith-bool-var.tact (100%) rename src/{grammar => 050-grammar}/test/expr-arith.tact (100%) rename src/{grammar => 050-grammar}/test/expr-chaining-unbox.tact (100%) rename src/{grammar => 050-grammar}/test/expr-condition-with-or.tact (100%) rename src/{grammar => 050-grammar}/test/expr-conditional-with-let.tact (100%) rename src/{grammar => 050-grammar}/test/expr-conditional.tact (100%) rename src/{grammar => 050-grammar}/test/expr-equality.spec.ts (100%) rename src/{grammar => 050-grammar}/test/expr-fun-call.tact (100%) rename src/{grammar => 050-grammar}/test/expr-int-literal.tact (100%) rename src/{grammar => 050-grammar}/test/expr-is-value.spec.ts (100%) rename src/{grammar => 050-grammar}/test/expr-nested-conditional.tact (100%) rename src/{grammar => 050-grammar}/test/expr-parens.tact (100%) rename src/{grammar => 050-grammar}/test/expr-with-unbox.tact (100%) rename src/{grammar => 050-grammar}/test/expr-with-var.tact (100%) rename src/{grammar => 050-grammar}/test/items-asm-funs.tact (100%) rename src/{grammar => 050-grammar}/test/items-method-def-initof-trailing-comma-shifts.tact (100%) rename src/{grammar => 050-grammar}/test/items-multi-funs.tact (100%) rename src/{grammar => 050-grammar}/test/items-native-fun-decls.tact (100%) rename src/{grammar => 050-grammar}/test/items-native-fun-funcid.tact (100%) rename src/{grammar => 050-grammar}/test/items-struct-msg-fun-const.tact (100%) rename src/{grammar => 050-grammar}/test/literals-int-underscores-bin-dec-hex-oct.tact (100%) rename src/{grammar => 050-grammar}/test/stmt-augmented-assign-arith.tact (100%) rename src/{grammar => 050-grammar}/test/stmt-augmented-assign-bitwise.tact (100%) rename src/{grammar => 050-grammar}/test/stmt-augmented-assign-logic.tact (100%) rename src/{grammar => 050-grammar}/test/stmt-destructuring.tact (100%) rename src/{grammar => 050-grammar}/test/stmt-if-else.tact (100%) rename src/{grammar => 050-grammar}/test/stmt-if.tact (100%) rename src/{grammar => 050-grammar}/test/stmt-optional-semicolon-for-last-statement.tact (100%) rename src/{grammar => 050-grammar}/test/stmt-while-loop.tact (100%) rename src/{grammar => 050-grammar}/test/stmt-while-repeat-do-loops.tact (100%) rename src/{grammar => 050-grammar}/test/struct-field-punning.tact (100%) rename src/{grammar => 050-grammar}/test/struct-msg-as.tact (100%) rename src/{grammar => 050-grammar}/test/struct-msg-initializers.tact (100%) rename src/{grammar => 050-grammar}/test/struct-msg-trailing-semicolon.tact (100%) rename src/{grammar => 050-grammar}/test/trait-optional-semicolon-for-last-const-decl.tact (100%) rename src/{grammar => 050-grammar}/test/trait-optional-semicolon-for-last-fun-decl.tact (100%) rename src/{grammar => 050-grammar}/test/traits-inheritance-trailing-comma.tact (100%) rename src/{grammar => 050-grammar}/test/type-struct-with-map.tact (100%) rename src/{grammar => 050-grammar}/test/types-optional.tact (100%) diff --git a/.prettierignore b/.prettierignore index 7c95c4b4c..f6a0d5517 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,9 +1,9 @@ /dist /src/func/funcfiftlib.js /src/func/funcfiftlib.wasm.js -/src/grammar/prev/grammar.ohm-bundle.d.ts -/src/grammar/prev/grammar.ohm-bundle.js -src/grammar/next/grammar.ts +/src/050-grammar/prev/grammar.ohm-bundle.d.ts +/src/050-grammar/prev/grammar.ohm-bundle.js +src/050-grammar/next/grammar.ts /src/imports/stdlib.ts /grammar /docs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d192ad2ca..1b348b7b8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -117,11 +117,11 @@ Some CLI tests can be found in [.github/workflows/tact.yml](./.github/workflows/ ### Parser -The [src/grammar/grammar.ohm](./src/grammar/grammar.ohm) file contains the Tact grammar expressed in the PEG-like language of the [Ohm.js](https://ohmjs.org) parser generator. +The [src/grammar/grammar.ohm](src/050-grammar/grammar.ohm) file contains the Tact grammar expressed in the PEG-like language of the [Ohm.js](https://ohmjs.org) parser generator. -The helper file [src/grammar/grammar.ts](./src/grammar/grammar.ts) contains the logic that transforms concrete syntax trees produced with the help of the Ohm.js-generated parser into abstract syntax trees (ASTs) defined in [src/grammar/ast.ts](./src/grammar/ast.ts). The grammar.ts file also does a bit of grammar validation, like checking that function or constant attributes are not duplicated or that user identifiers do not start with certain reserved prefixes. +The helper file [src/grammar/grammar.ts](src/050-grammar/grammar.ts) contains the logic that transforms concrete syntax trees produced with the help of the Ohm.js-generated parser into abstract syntax trees (ASTs) defined in [src/grammar/ast.ts](src/050-grammar/ast.ts). The grammar.ts file also does a bit of grammar validation, like checking that function or constant attributes are not duplicated or that user identifiers do not start with certain reserved prefixes. -The [src/grammar/test](./src/grammar/test) folder contains Tact files that are supposed to be parsed without any issues, and the [src/grammar/test-failed](./src/grammar/test-failed) folder contains grammatically incorrect test files which should result in parser errors. The parser error messages and the locations they point to are fixed in the [src/grammar/**snapshots**/grammar.spec.ts.snap](./src/grammar/__snapshots__/grammar.spec.ts.snap) Jest snapshot file. +The [src/grammar/test](src/050-grammar/test) folder contains Tact files that are supposed to be parsed without any issues, and the [src/grammar/test-failed](src/050-grammar/test-failed) folder contains grammatically incorrect test files which should result in parser errors. The parser error messages and the locations they point to are fixed in the [src/grammar/**snapshots**/grammar.spec.ts.snap](src/050-grammar/__snapshots__/grammar.spec.ts.snap) Jest snapshot file. ### Typechecker @@ -177,6 +177,6 @@ Some other codegen tests are as follows: The entry point to the Tact AST pretty-printer is [src/prettyPrinter.ts](./src/prettyPrinter.ts). It is going to be used for the Tact source code formatter once the parser keeps comments and other relevant information. -The AST comparator is defined in [src/grammar/compare.ts](./src/grammar/compare.ts). This is useful, for instance, for static analysis tools which can re-use the Tact TypeScript API. +The AST comparator is defined in [src/grammar/compare.ts](src/050-grammar/compare.ts). This is useful, for instance, for static analysis tools which can re-use the Tact TypeScript API. The corresponding test spec files can be found in [src/test](./src/test/) folder with the test contracts in [src/test/contracts](./src/test/contracts/) folder. diff --git a/STYLEGUIDE.md b/STYLEGUIDE.md index aff09e7ee..2a99dc9af 100644 --- a/STYLEGUIDE.md +++ b/STYLEGUIDE.md @@ -116,7 +116,7 @@ export const includes = ( - **Avoid unnecessary bigint**. We have to work with `bigint`, because TVM supports ints of 257 bit length, but in rest of the code `bigint` would only cause issues with debugging it. - **Beware of `${}`** in template strings. Any inlining succeeds, and there won't be any compile-time errors even if it's a function `${(x: number) => x}`. - **Avoid `null`**. `typeof null === 'object'`, and there is `undefined` anyway. -- **Avoid exceptions**. Exceptions are untyped. Pass error continuations explicitly `(onFooError: () => T) => T`. Example can be found in `src/grammar/parser-error.ts`. +- **Avoid exceptions**. Exceptions are untyped. Pass error continuations explicitly `(onFooError: () => T) => T`. Example can be found in `src/050-grammar/parser-error.ts`. - **Avoid tuples**. TS gives them minimal distinction from arrays, and type system is broken around them. Occasionally for performance reasons tuples might be a better option than objects. - **Avoid `enum`**. It's equivalent to unions since 5.0, except generates boilerplate JS code. A version that doesn't generate extraneous code, `const enum`, is not properly supported by `babel`. - **Avoid iterators**. They're untypable unless fixed in JS standard. Prefer generators. Prefer iterating with `for (... of ...)`. diff --git a/cspell.json b/cspell.json index 233921bb1..956f80712 100644 --- a/cspell.json +++ b/cspell.json @@ -152,13 +152,13 @@ "func", "grammar/sample.json", "src/generator/writers/writeStdlib.ts", - "src/grammar/grammar.ohm-bundle.d.ts", - "src/grammar/test/items-native-fun-funcid.tact", - "src/grammar/test/items-asm-funs.tact", - "src/grammar/test-asm/*.tact", - "src/grammar/test-failed/funcid-*.tact", - "src/grammar/next/grammar.gg", - "src/grammar/next/grammar.ts", + "src/050-grammar/grammar.ohm-bundle.d.ts", + "src/050-grammar/test/items-native-fun-funcid.tact", + "src/050-grammar/test/items-asm-funs.tact", + "src/050-grammar/test-asm/*.tact", + "src/050-grammar/test-failed/funcid-*.tact", + "src/050-grammar/next/grammar.gg", + "src/050-grammar/next/grammar.ts", "src/imports/stdlib.ts", "/src/test/compilation-failed/const-eval-failed.spec.ts", "src/test/e2e-emulated/address.spec.ts", diff --git a/knip.json b/knip.json index 34a0b0e6b..1a0015ab0 100644 --- a/knip.json +++ b/knip.json @@ -9,11 +9,11 @@ ], "project": ["src/**/*.ts", "bin/tact.js", "bin/unboc.js"], "ignore": [ - "src/grammar/ast.ts", + "src/050-grammar/ast.ts", "src/prettyPrinter.ts", "src/error/display-to-json.ts", - "src/grammar/src-info.ts", - "src/grammar/next/grammar.ts", + "src/050-grammar/src-info.ts", + "src/050-grammar/next/grammar.ts", ".github/workflows/tact*.yml" ], "ignoreDependencies": ["@tact-lang/ton-abi"] diff --git a/package.json b/package.json index 02265830b..d168699fb 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ "author": "Steve Korshakov ", "license": "MIT", "scripts": { - "gen:grammar:old": "ohm generateBundles --withTypes src/grammar/prev/*.ohm", - "gen:grammar:new": "pgen src/grammar/next/grammar.gg -o src/grammar/next/grammar.ts", + "gen:grammar:old": "ohm generateBundles --withTypes src/050-grammar/prev/*.ohm", + "gen:grammar:new": "pgen src/050-grammar/next/grammar.gg -o src/050-grammar/next/grammar.ts", "gen:grammar": "yarn gen:grammar:old && yarn gen:grammar:new", "gen:pack": "ts-node ./scripts/pack.ts", "gen:compiler": "ts-node ./scripts/prepare.ts", diff --git a/src/010-pipeline/build.ts b/src/010-pipeline/build.ts index 3c041cbcb..3f0c644f9 100644 --- a/src/010-pipeline/build.ts +++ b/src/010-pipeline/build.ts @@ -6,7 +6,7 @@ import { ConfigProject } from "../000-config/parseConfig"; import { CompilerContext } from "./context"; import { funcCompile } from "../func/funcCompile"; import { writeReport } from "../generator/writeReport"; -import { getRawAST } from "../grammar/store"; +import { getRawAST } from "../050-grammar/store"; import files from "../040-imports/stdlib"; import { ILogger, Logger } from "./logger"; import { PackageFileFormat } from "../packaging/fileFormat"; @@ -19,10 +19,10 @@ import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; import { compile } from "./compile"; import { precompile } from "./precompile"; import { getCompilerVersion } from "./version"; -import { FactoryAst, getAstFactory, idText } from "../grammar/ast"; +import { FactoryAst, getAstFactory, idText } from "../050-grammar/ast"; import { TactErrorCollection } from "../030-error/errors"; -import { getParser, Parser } from "../grammar"; -import { defaultParser } from "../grammar/grammar"; +import { getParser, Parser } from "../050-grammar"; +import { defaultParser } from "../050-grammar/grammar"; export function enableFeatures( ctx: CompilerContext, diff --git a/src/010-pipeline/precompile.ts b/src/010-pipeline/precompile.ts index 193c4817d..8a839b81e 100644 --- a/src/010-pipeline/precompile.ts +++ b/src/010-pipeline/precompile.ts @@ -1,14 +1,14 @@ import { CompilerContext } from "./context"; import { resolveDescriptors } from "../types/resolveDescriptors"; import { resolveAllocations } from "../storage/resolveAllocation"; -import { openContext } from "../grammar/store"; +import { openContext } from "../050-grammar/store"; import { resolveStatements } from "../types/resolveStatements"; import { resolveErrors } from "../types/resolveErrors"; import { resolveSignatures } from "../types/resolveSignatures"; import { resolveImports } from "../040-imports/resolveImports"; import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; -import { AstModule, FactoryAst } from "../grammar/ast"; -import { Parser } from "../grammar"; +import { AstModule, FactoryAst } from "../050-grammar/ast"; +import { Parser } from "../050-grammar"; export function precompile( ctx: CompilerContext, diff --git a/src/030-error/display-to-json.ts b/src/030-error/display-to-json.ts index 65138c2da..a081a3c89 100644 --- a/src/030-error/display-to-json.ts +++ b/src/030-error/display-to-json.ts @@ -3,8 +3,8 @@ */ import { throwInternalCompilerError } from "./errors"; -import { SrcInfo } from "../grammar"; -import { srcInfoEqual } from "../grammar/src-info"; +import { SrcInfo } from "../050-grammar"; +import { srcInfoEqual } from "../050-grammar/src-info"; import { ErrorDisplay } from "./display"; export type ErrorJson = ErrorSub | ErrorText | ErrorLink | ErrorAt; diff --git a/src/030-error/display.ts b/src/030-error/display.ts index 6f7cbf473..f0c15a3c8 100644 --- a/src/030-error/display.ts +++ b/src/030-error/display.ts @@ -2,7 +2,7 @@ * Describes DSL for displaying errors */ -import { SrcInfo } from "../grammar"; +import { SrcInfo } from "../050-grammar"; export interface ErrorDisplay { // Specify main error location diff --git a/src/030-error/errors.ts b/src/030-error/errors.ts index f12c0b4c8..675723f68 100644 --- a/src/030-error/errors.ts +++ b/src/030-error/errors.ts @@ -1,7 +1,7 @@ import path from "path"; import { cwd } from "process"; -import { AstFuncId, AstId, AstTypeId } from "../grammar/ast"; -import { SrcInfo } from "../grammar"; +import { AstFuncId, AstId, AstTypeId } from "../050-grammar/ast"; +import { SrcInfo } from "../050-grammar"; export class TactError extends Error { readonly loc?: SrcInfo; diff --git a/src/040-imports/resolveImports.spec.ts b/src/040-imports/resolveImports.spec.ts index 8f0e3d27c..4a2f16897 100644 --- a/src/040-imports/resolveImports.spec.ts +++ b/src/040-imports/resolveImports.spec.ts @@ -1,9 +1,9 @@ import { resolveImports } from "./resolveImports"; import { createNodeFileSystem } from "../020-vfs/createNodeFileSystem"; import path from "path"; -import { getParser } from "../grammar"; -import { getAstFactory } from "../grammar/ast"; -import { defaultParser } from "../grammar/grammar"; +import { getParser } from "../050-grammar"; +import { getAstFactory } from "../050-grammar/ast"; +import { defaultParser } from "../050-grammar/grammar"; describe("resolveImports", () => { it("should resolve imports", () => { diff --git a/src/040-imports/resolveImports.ts b/src/040-imports/resolveImports.ts index 278c58153..a7cc0d52c 100644 --- a/src/040-imports/resolveImports.ts +++ b/src/040-imports/resolveImports.ts @@ -1,4 +1,4 @@ -import { ItemOrigin, Parser } from "../grammar"; +import { ItemOrigin, Parser } from "../050-grammar"; import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; import { throwCompilationError } from "../030-error/errors"; import { resolveLibrary } from "./resolveLibrary"; diff --git a/src/grammar/ast-typed.ts b/src/050-grammar/ast-typed.ts similarity index 100% rename from src/grammar/ast-typed.ts rename to src/050-grammar/ast-typed.ts diff --git a/src/grammar/ast.ts b/src/050-grammar/ast.ts similarity index 100% rename from src/grammar/ast.ts rename to src/050-grammar/ast.ts diff --git a/src/grammar/clone.ts b/src/050-grammar/clone.ts similarity index 100% rename from src/grammar/clone.ts rename to src/050-grammar/clone.ts diff --git a/src/grammar/compare.ts b/src/050-grammar/compare.ts similarity index 100% rename from src/grammar/compare.ts rename to src/050-grammar/compare.ts diff --git a/src/grammar/grammar.ts b/src/050-grammar/grammar.ts similarity index 100% rename from src/grammar/grammar.ts rename to src/050-grammar/grammar.ts diff --git a/src/grammar/hash.ts b/src/050-grammar/hash.ts similarity index 100% rename from src/grammar/hash.ts rename to src/050-grammar/hash.ts diff --git a/src/grammar/index.ts b/src/050-grammar/index.ts similarity index 100% rename from src/grammar/index.ts rename to src/050-grammar/index.ts diff --git a/src/grammar/iterators.ts b/src/050-grammar/iterators.ts similarity index 100% rename from src/grammar/iterators.ts rename to src/050-grammar/iterators.ts diff --git a/src/grammar/next/__snapshots__/grammar.spec.ts.snap b/src/050-grammar/next/__snapshots__/grammar.spec.ts.snap similarity index 100% rename from src/grammar/next/__snapshots__/grammar.spec.ts.snap rename to src/050-grammar/next/__snapshots__/grammar.spec.ts.snap diff --git a/src/grammar/next/grammar.gg b/src/050-grammar/next/grammar.gg similarity index 100% rename from src/grammar/next/grammar.gg rename to src/050-grammar/next/grammar.gg diff --git a/src/grammar/next/grammar.spec.ts b/src/050-grammar/next/grammar.spec.ts similarity index 100% rename from src/grammar/next/grammar.spec.ts rename to src/050-grammar/next/grammar.spec.ts diff --git a/src/grammar/next/grammar.ts b/src/050-grammar/next/grammar.ts similarity index 100% rename from src/grammar/next/grammar.ts rename to src/050-grammar/next/grammar.ts diff --git a/src/grammar/next/index.ts b/src/050-grammar/next/index.ts similarity index 100% rename from src/grammar/next/index.ts rename to src/050-grammar/next/index.ts diff --git a/src/grammar/parser-error.ts b/src/050-grammar/parser-error.ts similarity index 100% rename from src/grammar/parser-error.ts rename to src/050-grammar/parser-error.ts diff --git a/src/grammar/prev/__snapshots__/grammar.spec.ts.snap b/src/050-grammar/prev/__snapshots__/grammar.spec.ts.snap similarity index 100% rename from src/grammar/prev/__snapshots__/grammar.spec.ts.snap rename to src/050-grammar/prev/__snapshots__/grammar.spec.ts.snap diff --git a/src/grammar/prev/grammar.ohm b/src/050-grammar/prev/grammar.ohm similarity index 100% rename from src/grammar/prev/grammar.ohm rename to src/050-grammar/prev/grammar.ohm diff --git a/src/grammar/prev/grammar.spec.ts b/src/050-grammar/prev/grammar.spec.ts similarity index 100% rename from src/grammar/prev/grammar.spec.ts rename to src/050-grammar/prev/grammar.spec.ts diff --git a/src/grammar/prev/grammar.ts b/src/050-grammar/prev/grammar.ts similarity index 100% rename from src/grammar/prev/grammar.ts rename to src/050-grammar/prev/grammar.ts diff --git a/src/grammar/prev/parser-error.ts b/src/050-grammar/prev/parser-error.ts similarity index 100% rename from src/grammar/prev/parser-error.ts rename to src/050-grammar/prev/parser-error.ts diff --git a/src/grammar/prev/src-info.ts b/src/050-grammar/prev/src-info.ts similarity index 100% rename from src/grammar/prev/src-info.ts rename to src/050-grammar/prev/src-info.ts diff --git a/src/grammar/rename.ts b/src/050-grammar/rename.ts similarity index 100% rename from src/grammar/rename.ts rename to src/050-grammar/rename.ts diff --git a/src/grammar/sort.ts b/src/050-grammar/sort.ts similarity index 100% rename from src/grammar/sort.ts rename to src/050-grammar/sort.ts diff --git a/src/grammar/src-info.ts b/src/050-grammar/src-info.ts similarity index 100% rename from src/grammar/src-info.ts rename to src/050-grammar/src-info.ts diff --git a/src/grammar/store.ts b/src/050-grammar/store.ts similarity index 100% rename from src/grammar/store.ts rename to src/050-grammar/store.ts diff --git a/src/grammar/test-failed/abstract-const-without-modifier.tact b/src/050-grammar/test-failed/abstract-const-without-modifier.tact similarity index 100% rename from src/grammar/test-failed/abstract-const-without-modifier.tact rename to src/050-grammar/test-failed/abstract-const-without-modifier.tact diff --git a/src/grammar/test-failed/const-abstract-abstract.tact b/src/050-grammar/test-failed/const-abstract-abstract.tact similarity index 100% rename from src/grammar/test-failed/const-abstract-abstract.tact rename to src/050-grammar/test-failed/const-abstract-abstract.tact diff --git a/src/grammar/test-failed/const-override-override.tact b/src/050-grammar/test-failed/const-override-override.tact similarity index 100% rename from src/grammar/test-failed/const-override-override.tact rename to src/050-grammar/test-failed/const-override-override.tact diff --git a/src/grammar/test-failed/const-override-virtual.tact b/src/050-grammar/test-failed/const-override-virtual.tact similarity index 100% rename from src/grammar/test-failed/const-override-virtual.tact rename to src/050-grammar/test-failed/const-override-virtual.tact diff --git a/src/grammar/test-failed/const-override.tact b/src/050-grammar/test-failed/const-override.tact similarity index 100% rename from src/grammar/test-failed/const-override.tact rename to src/050-grammar/test-failed/const-override.tact diff --git a/src/grammar/test-failed/const-virtual-override.tact b/src/050-grammar/test-failed/const-virtual-override.tact similarity index 100% rename from src/grammar/test-failed/const-virtual-override.tact rename to src/050-grammar/test-failed/const-virtual-override.tact diff --git a/src/grammar/test-failed/const-virtual-virtual.tact b/src/050-grammar/test-failed/const-virtual-virtual.tact similarity index 100% rename from src/grammar/test-failed/const-virtual-virtual.tact rename to src/050-grammar/test-failed/const-virtual-virtual.tact diff --git a/src/grammar/test-failed/const-virtual.tact b/src/050-grammar/test-failed/const-virtual.tact similarity index 100% rename from src/grammar/test-failed/const-virtual.tact rename to src/050-grammar/test-failed/const-virtual.tact diff --git a/src/grammar/test-failed/contract-const-abstract-abstract.tact b/src/050-grammar/test-failed/contract-const-abstract-abstract.tact similarity index 100% rename from src/grammar/test-failed/contract-const-abstract-abstract.tact rename to src/050-grammar/test-failed/contract-const-abstract-abstract.tact diff --git a/src/grammar/test-failed/contract-const-abstract-with-initializer.tact b/src/050-grammar/test-failed/contract-const-abstract-with-initializer.tact similarity index 100% rename from src/grammar/test-failed/contract-const-abstract-with-initializer.tact rename to src/050-grammar/test-failed/contract-const-abstract-with-initializer.tact diff --git a/src/grammar/test-failed/contract-const-abstract.tact b/src/050-grammar/test-failed/contract-const-abstract.tact similarity index 100% rename from src/grammar/test-failed/contract-const-abstract.tact rename to src/050-grammar/test-failed/contract-const-abstract.tact diff --git a/src/grammar/test-failed/contract-const-override-override.tact b/src/050-grammar/test-failed/contract-const-override-override.tact similarity index 100% rename from src/grammar/test-failed/contract-const-override-override.tact rename to src/050-grammar/test-failed/contract-const-override-override.tact diff --git a/src/grammar/test-failed/contract-const-virtual-virtual.tact b/src/050-grammar/test-failed/contract-const-virtual-virtual.tact similarity index 100% rename from src/grammar/test-failed/contract-const-virtual-virtual.tact rename to src/050-grammar/test-failed/contract-const-virtual-virtual.tact diff --git a/src/grammar/test-failed/contract-empty-traits-list-with-keyword.tact b/src/050-grammar/test-failed/contract-empty-traits-list-with-keyword.tact similarity index 100% rename from src/grammar/test-failed/contract-empty-traits-list-with-keyword.tact rename to src/050-grammar/test-failed/contract-empty-traits-list-with-keyword.tact diff --git a/src/grammar/test-failed/contract-getter-parens-no-method-id.tact b/src/050-grammar/test-failed/contract-getter-parens-no-method-id.tact similarity index 100% rename from src/grammar/test-failed/contract-getter-parens-no-method-id.tact rename to src/050-grammar/test-failed/contract-getter-parens-no-method-id.tact diff --git a/src/grammar/test-failed/contract-init-trailing-comma-empty-params.tact b/src/050-grammar/test-failed/contract-init-trailing-comma-empty-params.tact similarity index 100% rename from src/grammar/test-failed/contract-init-trailing-comma-empty-params.tact rename to src/050-grammar/test-failed/contract-init-trailing-comma-empty-params.tact diff --git a/src/grammar/test-failed/contract-trailing-comma-empty-traits-list.tact b/src/050-grammar/test-failed/contract-trailing-comma-empty-traits-list.tact similarity index 100% rename from src/grammar/test-failed/contract-trailing-comma-empty-traits-list.tact rename to src/050-grammar/test-failed/contract-trailing-comma-empty-traits-list.tact diff --git a/src/grammar/test-failed/contract-with-imports.tact b/src/050-grammar/test-failed/contract-with-imports.tact similarity index 100% rename from src/grammar/test-failed/contract-with-imports.tact rename to src/050-grammar/test-failed/contract-with-imports.tact diff --git a/src/grammar/test-failed/destructuring-duplicate-source-id.tact b/src/050-grammar/test-failed/destructuring-duplicate-source-id.tact similarity index 100% rename from src/grammar/test-failed/destructuring-duplicate-source-id.tact rename to src/050-grammar/test-failed/destructuring-duplicate-source-id.tact diff --git a/src/grammar/test-failed/expr-fun-call-trailing-comma-no-args.tact b/src/050-grammar/test-failed/expr-fun-call-trailing-comma-no-args.tact similarity index 100% rename from src/grammar/test-failed/expr-fun-call-trailing-comma-no-args.tact rename to src/050-grammar/test-failed/expr-fun-call-trailing-comma-no-args.tact diff --git a/src/grammar/test-failed/expr-method-call-trailing-comma-no-args.tact b/src/050-grammar/test-failed/expr-method-call-trailing-comma-no-args.tact similarity index 100% rename from src/grammar/test-failed/expr-method-call-trailing-comma-no-args.tact rename to src/050-grammar/test-failed/expr-method-call-trailing-comma-no-args.tact diff --git a/src/grammar/test-failed/funcid-native-fun-arith-operator.tact b/src/050-grammar/test-failed/funcid-native-fun-arith-operator.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-arith-operator.tact rename to src/050-grammar/test-failed/funcid-native-fun-arith-operator.tact diff --git a/src/grammar/test-failed/funcid-native-fun-assign-operator.tact b/src/050-grammar/test-failed/funcid-native-fun-assign-operator.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-assign-operator.tact rename to src/050-grammar/test-failed/funcid-native-fun-assign-operator.tact diff --git a/src/grammar/test-failed/funcid-native-fun-bitwise-operator.tact b/src/050-grammar/test-failed/funcid-native-fun-bitwise-operator.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-bitwise-operator.tact rename to src/050-grammar/test-failed/funcid-native-fun-bitwise-operator.tact diff --git a/src/grammar/test-failed/funcid-native-fun-comma.tact b/src/050-grammar/test-failed/funcid-native-fun-comma.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-comma.tact rename to src/050-grammar/test-failed/funcid-native-fun-comma.tact diff --git a/src/grammar/test-failed/funcid-native-fun-comparison-operator.tact b/src/050-grammar/test-failed/funcid-native-fun-comparison-operator.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-comparison-operator.tact rename to src/050-grammar/test-failed/funcid-native-fun-comparison-operator.tact diff --git a/src/grammar/test-failed/funcid-native-fun-control-keyword.tact b/src/050-grammar/test-failed/funcid-native-fun-control-keyword.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-control-keyword.tact rename to src/050-grammar/test-failed/funcid-native-fun-control-keyword.tact diff --git a/src/grammar/test-failed/funcid-native-fun-delimiter.tact b/src/050-grammar/test-failed/funcid-native-fun-delimiter.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-delimiter.tact rename to src/050-grammar/test-failed/funcid-native-fun-delimiter.tact diff --git a/src/grammar/test-failed/funcid-native-fun-directive.tact b/src/050-grammar/test-failed/funcid-native-fun-directive.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-directive.tact rename to src/050-grammar/test-failed/funcid-native-fun-directive.tact diff --git a/src/grammar/test-failed/funcid-native-fun-dot.tact b/src/050-grammar/test-failed/funcid-native-fun-dot.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-dot.tact rename to src/050-grammar/test-failed/funcid-native-fun-dot.tact diff --git a/src/grammar/test-failed/funcid-native-fun-keyword.tact b/src/050-grammar/test-failed/funcid-native-fun-keyword.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-keyword.tact rename to src/050-grammar/test-failed/funcid-native-fun-keyword.tact diff --git a/src/grammar/test-failed/funcid-native-fun-multiline-comments.tact b/src/050-grammar/test-failed/funcid-native-fun-multiline-comments.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-multiline-comments.tact rename to src/050-grammar/test-failed/funcid-native-fun-multiline-comments.tact diff --git a/src/grammar/test-failed/funcid-native-fun-number-decimal.tact b/src/050-grammar/test-failed/funcid-native-fun-number-decimal.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-number-decimal.tact rename to src/050-grammar/test-failed/funcid-native-fun-number-decimal.tact diff --git a/src/grammar/test-failed/funcid-native-fun-number-hexadecimal-2.tact b/src/050-grammar/test-failed/funcid-native-fun-number-hexadecimal-2.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-number-hexadecimal-2.tact rename to src/050-grammar/test-failed/funcid-native-fun-number-hexadecimal-2.tact diff --git a/src/grammar/test-failed/funcid-native-fun-number-hexadecimal.tact b/src/050-grammar/test-failed/funcid-native-fun-number-hexadecimal.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-number-hexadecimal.tact rename to src/050-grammar/test-failed/funcid-native-fun-number-hexadecimal.tact diff --git a/src/grammar/test-failed/funcid-native-fun-number-neg-decimal.tact b/src/050-grammar/test-failed/funcid-native-fun-number-neg-decimal.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-number-neg-decimal.tact rename to src/050-grammar/test-failed/funcid-native-fun-number-neg-decimal.tact diff --git a/src/grammar/test-failed/funcid-native-fun-number-neg-hexadecimal.tact b/src/050-grammar/test-failed/funcid-native-fun-number-neg-hexadecimal.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-number-neg-hexadecimal.tact rename to src/050-grammar/test-failed/funcid-native-fun-number-neg-hexadecimal.tact diff --git a/src/grammar/test-failed/funcid-native-fun-number.tact b/src/050-grammar/test-failed/funcid-native-fun-number.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-number.tact rename to src/050-grammar/test-failed/funcid-native-fun-number.tact diff --git a/src/grammar/test-failed/funcid-native-fun-only-underscore.tact b/src/050-grammar/test-failed/funcid-native-fun-only-underscore.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-only-underscore.tact rename to src/050-grammar/test-failed/funcid-native-fun-only-underscore.tact diff --git a/src/grammar/test-failed/funcid-native-fun-parens.tact b/src/050-grammar/test-failed/funcid-native-fun-parens.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-parens.tact rename to src/050-grammar/test-failed/funcid-native-fun-parens.tact diff --git a/src/grammar/test-failed/funcid-native-fun-semicolons.tact b/src/050-grammar/test-failed/funcid-native-fun-semicolons.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-semicolons.tact rename to src/050-grammar/test-failed/funcid-native-fun-semicolons.tact diff --git a/src/grammar/test-failed/funcid-native-fun-space.tact b/src/050-grammar/test-failed/funcid-native-fun-space.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-space.tact rename to src/050-grammar/test-failed/funcid-native-fun-space.tact diff --git a/src/grammar/test-failed/funcid-native-fun-square-brackets.tact b/src/050-grammar/test-failed/funcid-native-fun-square-brackets.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-square-brackets.tact rename to src/050-grammar/test-failed/funcid-native-fun-square-brackets.tact diff --git a/src/grammar/test-failed/funcid-native-fun-string.tact b/src/050-grammar/test-failed/funcid-native-fun-string.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-string.tact rename to src/050-grammar/test-failed/funcid-native-fun-string.tact diff --git a/src/grammar/test-failed/funcid-native-fun-type-keyword.tact b/src/050-grammar/test-failed/funcid-native-fun-type-keyword.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-type-keyword.tact rename to src/050-grammar/test-failed/funcid-native-fun-type-keyword.tact diff --git a/src/grammar/test-failed/funcid-native-fun-unclosed-parens.tact b/src/050-grammar/test-failed/funcid-native-fun-unclosed-parens.tact similarity index 100% rename from src/grammar/test-failed/funcid-native-fun-unclosed-parens.tact rename to src/050-grammar/test-failed/funcid-native-fun-unclosed-parens.tact diff --git a/src/grammar/test-failed/ident-cannot-be-if-reserved-word.tact b/src/050-grammar/test-failed/ident-cannot-be-if-reserved-word.tact similarity index 100% rename from src/grammar/test-failed/ident-cannot-be-if-reserved-word.tact rename to src/050-grammar/test-failed/ident-cannot-be-if-reserved-word.tact diff --git a/src/grammar/test-failed/ident-contract-cannot-start-with-__gen.tact b/src/050-grammar/test-failed/ident-contract-cannot-start-with-__gen.tact similarity index 100% rename from src/grammar/test-failed/ident-contract-cannot-start-with-__gen.tact rename to src/050-grammar/test-failed/ident-contract-cannot-start-with-__gen.tact diff --git a/src/grammar/test-failed/ident-fun-cannot-start-with-__gen.tact b/src/050-grammar/test-failed/ident-fun-cannot-start-with-__gen.tact similarity index 100% rename from src/grammar/test-failed/ident-fun-cannot-start-with-__gen.tact rename to src/050-grammar/test-failed/ident-fun-cannot-start-with-__gen.tact diff --git a/src/grammar/test-failed/ident-fun-param-cannot-start-with-__gen.tact b/src/050-grammar/test-failed/ident-fun-param-cannot-start-with-__gen.tact similarity index 100% rename from src/grammar/test-failed/ident-fun-param-cannot-start-with-__gen.tact rename to src/050-grammar/test-failed/ident-fun-param-cannot-start-with-__gen.tact diff --git a/src/grammar/test-failed/ident-fun-param-cannot-start-with-__tact.tact b/src/050-grammar/test-failed/ident-fun-param-cannot-start-with-__tact.tact similarity index 100% rename from src/grammar/test-failed/ident-fun-param-cannot-start-with-__tact.tact rename to src/050-grammar/test-failed/ident-fun-param-cannot-start-with-__tact.tact diff --git a/src/grammar/test-failed/ident-init-param-cannot-start-with-__tact.tact b/src/050-grammar/test-failed/ident-init-param-cannot-start-with-__tact.tact similarity index 100% rename from src/grammar/test-failed/ident-init-param-cannot-start-with-__tact.tact rename to src/050-grammar/test-failed/ident-init-param-cannot-start-with-__tact.tact diff --git a/src/grammar/test-failed/ident-let-cannot-start-with-__gen.tact b/src/050-grammar/test-failed/ident-let-cannot-start-with-__gen.tact similarity index 100% rename from src/grammar/test-failed/ident-let-cannot-start-with-__gen.tact rename to src/050-grammar/test-failed/ident-let-cannot-start-with-__gen.tact diff --git a/src/grammar/test-failed/ident-let-cannot-start-with-__tact.tact b/src/050-grammar/test-failed/ident-let-cannot-start-with-__tact.tact similarity index 100% rename from src/grammar/test-failed/ident-let-cannot-start-with-__tact.tact rename to src/050-grammar/test-failed/ident-let-cannot-start-with-__tact.tact diff --git a/src/grammar/test-failed/ident-struct-cannot-start-with-__gen.tact b/src/050-grammar/test-failed/ident-struct-cannot-start-with-__gen.tact similarity index 100% rename from src/grammar/test-failed/ident-struct-cannot-start-with-__gen.tact rename to src/050-grammar/test-failed/ident-struct-cannot-start-with-__gen.tact diff --git a/src/grammar/test-failed/item-fun-non-void-trailing-comma-no-params.tact b/src/050-grammar/test-failed/item-fun-non-void-trailing-comma-no-params.tact similarity index 100% rename from src/grammar/test-failed/item-fun-non-void-trailing-comma-no-params.tact rename to src/050-grammar/test-failed/item-fun-non-void-trailing-comma-no-params.tact diff --git a/src/grammar/test-failed/item-fun-void-trailing-comma-no-params.tact b/src/050-grammar/test-failed/item-fun-void-trailing-comma-no-params.tact similarity index 100% rename from src/grammar/test-failed/item-fun-void-trailing-comma-no-params.tact rename to src/050-grammar/test-failed/item-fun-void-trailing-comma-no-params.tact diff --git a/src/grammar/test-failed/item-fun-without-body.tact b/src/050-grammar/test-failed/item-fun-without-body.tact similarity index 100% rename from src/grammar/test-failed/item-fun-without-body.tact rename to src/050-grammar/test-failed/item-fun-without-body.tact diff --git a/src/grammar/test-failed/item-native-fun-not-void-decl-trailing-comma-no-params.tact b/src/050-grammar/test-failed/item-native-fun-not-void-decl-trailing-comma-no-params.tact similarity index 100% rename from src/grammar/test-failed/item-native-fun-not-void-decl-trailing-comma-no-params.tact rename to src/050-grammar/test-failed/item-native-fun-not-void-decl-trailing-comma-no-params.tact diff --git a/src/grammar/test-failed/item-native-fun-void-decl-trailing-comma-no-params.tact b/src/050-grammar/test-failed/item-native-fun-void-decl-trailing-comma-no-params.tact similarity index 100% rename from src/grammar/test-failed/item-native-fun-void-decl-trailing-comma-no-params.tact rename to src/050-grammar/test-failed/item-native-fun-void-decl-trailing-comma-no-params.tact diff --git a/src/grammar/test-failed/items-asm-fun-1.tact b/src/050-grammar/test-failed/items-asm-fun-1.tact similarity index 100% rename from src/grammar/test-failed/items-asm-fun-1.tact rename to src/050-grammar/test-failed/items-asm-fun-1.tact diff --git a/src/grammar/test-failed/items-asm-fun-2.tact b/src/050-grammar/test-failed/items-asm-fun-2.tact similarity index 100% rename from src/grammar/test-failed/items-asm-fun-2.tact rename to src/050-grammar/test-failed/items-asm-fun-2.tact diff --git a/src/grammar/test-failed/items-asm-fun-3.tact b/src/050-grammar/test-failed/items-asm-fun-3.tact similarity index 100% rename from src/grammar/test-failed/items-asm-fun-3.tact rename to src/050-grammar/test-failed/items-asm-fun-3.tact diff --git a/src/grammar/test-failed/items-asm-fun-4.tact b/src/050-grammar/test-failed/items-asm-fun-4.tact similarity index 100% rename from src/grammar/test-failed/items-asm-fun-4.tact rename to src/050-grammar/test-failed/items-asm-fun-4.tact diff --git a/src/grammar/test-failed/items-asm-fun-5.tact b/src/050-grammar/test-failed/items-asm-fun-5.tact similarity index 100% rename from src/grammar/test-failed/items-asm-fun-5.tact rename to src/050-grammar/test-failed/items-asm-fun-5.tact diff --git a/src/grammar/test-failed/literal-dec-trailing-underscore.tact b/src/050-grammar/test-failed/literal-dec-trailing-underscore.tact similarity index 100% rename from src/grammar/test-failed/literal-dec-trailing-underscore.tact rename to src/050-grammar/test-failed/literal-dec-trailing-underscore.tact diff --git a/src/grammar/test-failed/literal-double-underscore.tact b/src/050-grammar/test-failed/literal-double-underscore.tact similarity index 100% rename from src/grammar/test-failed/literal-double-underscore.tact rename to src/050-grammar/test-failed/literal-double-underscore.tact diff --git a/src/grammar/test-failed/literal-hex-trailing-underscore.tact b/src/050-grammar/test-failed/literal-hex-trailing-underscore.tact similarity index 100% rename from src/grammar/test-failed/literal-hex-trailing-underscore.tact rename to src/050-grammar/test-failed/literal-hex-trailing-underscore.tact diff --git a/src/grammar/test-failed/literal-no-underscore-after-0b.tact b/src/050-grammar/test-failed/literal-no-underscore-after-0b.tact similarity index 100% rename from src/grammar/test-failed/literal-no-underscore-after-0b.tact rename to src/050-grammar/test-failed/literal-no-underscore-after-0b.tact diff --git a/src/grammar/test-failed/literal-no-underscores-if-leading-zero.tact b/src/050-grammar/test-failed/literal-no-underscores-if-leading-zero.tact similarity index 100% rename from src/grammar/test-failed/literal-no-underscores-if-leading-zero.tact rename to src/050-grammar/test-failed/literal-no-underscores-if-leading-zero.tact diff --git a/src/grammar/test-failed/literal-non-binary-digits.tact b/src/050-grammar/test-failed/literal-non-binary-digits.tact similarity index 100% rename from src/grammar/test-failed/literal-non-binary-digits.tact rename to src/050-grammar/test-failed/literal-non-binary-digits.tact diff --git a/src/grammar/test-failed/literal-underscore-after-leading-zero.tact b/src/050-grammar/test-failed/literal-underscore-after-leading-zero.tact similarity index 100% rename from src/grammar/test-failed/literal-underscore-after-leading-zero.tact rename to src/050-grammar/test-failed/literal-underscore-after-leading-zero.tact diff --git a/src/grammar/test-failed/struct-double-semicolon.tact b/src/050-grammar/test-failed/struct-double-semicolon.tact similarity index 100% rename from src/grammar/test-failed/struct-double-semicolon.tact rename to src/050-grammar/test-failed/struct-double-semicolon.tact diff --git a/src/grammar/test-failed/struct-missing-semicolon-between-fields-with-initializer.tact b/src/050-grammar/test-failed/struct-missing-semicolon-between-fields-with-initializer.tact similarity index 100% rename from src/grammar/test-failed/struct-missing-semicolon-between-fields-with-initializer.tact rename to src/050-grammar/test-failed/struct-missing-semicolon-between-fields-with-initializer.tact diff --git a/src/grammar/test-failed/struct-missing-semicolon-between-fields.tact b/src/050-grammar/test-failed/struct-missing-semicolon-between-fields.tact similarity index 100% rename from src/grammar/test-failed/struct-missing-semicolon-between-fields.tact rename to src/050-grammar/test-failed/struct-missing-semicolon-between-fields.tact diff --git a/src/grammar/test-failed/trait-const-abstract-with-initializer.tact b/src/050-grammar/test-failed/trait-const-abstract-with-initializer.tact similarity index 100% rename from src/grammar/test-failed/trait-const-abstract-with-initializer.tact rename to src/050-grammar/test-failed/trait-const-abstract-with-initializer.tact diff --git a/src/grammar/test-failed/trait-empty-traits-list-with-keyword.tact b/src/050-grammar/test-failed/trait-empty-traits-list-with-keyword.tact similarity index 100% rename from src/grammar/test-failed/trait-empty-traits-list-with-keyword.tact rename to src/050-grammar/test-failed/trait-empty-traits-list-with-keyword.tact diff --git a/src/grammar/test-failed/trait-fun-non-void-trailing-comma-no-params.tact b/src/050-grammar/test-failed/trait-fun-non-void-trailing-comma-no-params.tact similarity index 100% rename from src/grammar/test-failed/trait-fun-non-void-trailing-comma-no-params.tact rename to src/050-grammar/test-failed/trait-fun-non-void-trailing-comma-no-params.tact diff --git a/src/grammar/test-failed/trait-fun-void-trailing-comma-no-params.tact b/src/050-grammar/test-failed/trait-fun-void-trailing-comma-no-params.tact similarity index 100% rename from src/grammar/test-failed/trait-fun-void-trailing-comma-no-params.tact rename to src/050-grammar/test-failed/trait-fun-void-trailing-comma-no-params.tact diff --git a/src/grammar/test-failed/trait-trailing-comma-empty-traits-list.tact b/src/050-grammar/test-failed/trait-trailing-comma-empty-traits-list.tact similarity index 100% rename from src/grammar/test-failed/trait-trailing-comma-empty-traits-list.tact rename to src/050-grammar/test-failed/trait-trailing-comma-empty-traits-list.tact diff --git a/src/grammar/test-failed/type-ident-msg-should-be-capitalized.tact b/src/050-grammar/test-failed/type-ident-msg-should-be-capitalized.tact similarity index 100% rename from src/grammar/test-failed/type-ident-msg-should-be-capitalized.tact rename to src/050-grammar/test-failed/type-ident-msg-should-be-capitalized.tact diff --git a/src/grammar/test-failed/type-ident-struct-should-be-capitalized.tact b/src/050-grammar/test-failed/type-ident-struct-should-be-capitalized.tact similarity index 100% rename from src/grammar/test-failed/type-ident-struct-should-be-capitalized.tact rename to src/050-grammar/test-failed/type-ident-struct-should-be-capitalized.tact diff --git a/src/grammar/test/abstract-const.tact b/src/050-grammar/test/abstract-const.tact similarity index 100% rename from src/grammar/test/abstract-const.tact rename to src/050-grammar/test/abstract-const.tact diff --git a/src/grammar/test/case-35.tact b/src/050-grammar/test/case-35.tact similarity index 100% rename from src/grammar/test/case-35.tact rename to src/050-grammar/test/case-35.tact diff --git a/src/grammar/test/contract-getter-with-method-id.tact b/src/050-grammar/test/contract-getter-with-method-id.tact similarity index 100% rename from src/grammar/test/contract-getter-with-method-id.tact rename to src/050-grammar/test/contract-getter-with-method-id.tact diff --git a/src/grammar/test/contract-optional-semicolon-for-last-const-def.tact b/src/050-grammar/test/contract-optional-semicolon-for-last-const-def.tact similarity index 100% rename from src/grammar/test/contract-optional-semicolon-for-last-const-def.tact rename to src/050-grammar/test/contract-optional-semicolon-for-last-const-def.tact diff --git a/src/grammar/test/contract-optional-semicolon-for-last-storage-var.tact b/src/050-grammar/test/contract-optional-semicolon-for-last-storage-var.tact similarity index 100% rename from src/grammar/test/contract-optional-semicolon-for-last-storage-var.tact rename to src/050-grammar/test/contract-optional-semicolon-for-last-storage-var.tact diff --git a/src/grammar/test/contract-with-const-override.tact b/src/050-grammar/test/contract-with-const-override.tact similarity index 100% rename from src/grammar/test/contract-with-const-override.tact rename to src/050-grammar/test/contract-with-const-override.tact diff --git a/src/grammar/test/contract-with-imports.tact b/src/050-grammar/test/contract-with-imports.tact similarity index 100% rename from src/grammar/test/contract-with-imports.tact rename to src/050-grammar/test/contract-with-imports.tact diff --git a/src/grammar/test/contract-with-init.tact b/src/050-grammar/test/contract-with-init.tact similarity index 100% rename from src/grammar/test/contract-with-init.tact rename to src/050-grammar/test/contract-with-init.tact diff --git a/src/grammar/test/contract-with-trait-string-literal.tact b/src/050-grammar/test/contract-with-trait-string-literal.tact similarity index 100% rename from src/grammar/test/contract-with-trait-string-literal.tact rename to src/050-grammar/test/contract-with-trait-string-literal.tact diff --git a/src/grammar/test/contract-with-trait.tact b/src/050-grammar/test/contract-with-trait.tact similarity index 100% rename from src/grammar/test/contract-with-trait.tact rename to src/050-grammar/test/contract-with-trait.tact diff --git a/src/grammar/test/expr-arith-and-cmp.tact b/src/050-grammar/test/expr-arith-and-cmp.tact similarity index 100% rename from src/grammar/test/expr-arith-and-cmp.tact rename to src/050-grammar/test/expr-arith-and-cmp.tact diff --git a/src/grammar/test/expr-arith-bool-cmp-method-call.tact b/src/050-grammar/test/expr-arith-bool-cmp-method-call.tact similarity index 100% rename from src/grammar/test/expr-arith-bool-cmp-method-call.tact rename to src/050-grammar/test/expr-arith-bool-cmp-method-call.tact diff --git a/src/grammar/test/expr-arith-bool-var.tact b/src/050-grammar/test/expr-arith-bool-var.tact similarity index 100% rename from src/grammar/test/expr-arith-bool-var.tact rename to src/050-grammar/test/expr-arith-bool-var.tact diff --git a/src/grammar/test/expr-arith.tact b/src/050-grammar/test/expr-arith.tact similarity index 100% rename from src/grammar/test/expr-arith.tact rename to src/050-grammar/test/expr-arith.tact diff --git a/src/grammar/test/expr-chaining-unbox.tact b/src/050-grammar/test/expr-chaining-unbox.tact similarity index 100% rename from src/grammar/test/expr-chaining-unbox.tact rename to src/050-grammar/test/expr-chaining-unbox.tact diff --git a/src/grammar/test/expr-condition-with-or.tact b/src/050-grammar/test/expr-condition-with-or.tact similarity index 100% rename from src/grammar/test/expr-condition-with-or.tact rename to src/050-grammar/test/expr-condition-with-or.tact diff --git a/src/grammar/test/expr-conditional-with-let.tact b/src/050-grammar/test/expr-conditional-with-let.tact similarity index 100% rename from src/grammar/test/expr-conditional-with-let.tact rename to src/050-grammar/test/expr-conditional-with-let.tact diff --git a/src/grammar/test/expr-conditional.tact b/src/050-grammar/test/expr-conditional.tact similarity index 100% rename from src/grammar/test/expr-conditional.tact rename to src/050-grammar/test/expr-conditional.tact diff --git a/src/grammar/test/expr-equality.spec.ts b/src/050-grammar/test/expr-equality.spec.ts similarity index 100% rename from src/grammar/test/expr-equality.spec.ts rename to src/050-grammar/test/expr-equality.spec.ts diff --git a/src/grammar/test/expr-fun-call.tact b/src/050-grammar/test/expr-fun-call.tact similarity index 100% rename from src/grammar/test/expr-fun-call.tact rename to src/050-grammar/test/expr-fun-call.tact diff --git a/src/grammar/test/expr-int-literal.tact b/src/050-grammar/test/expr-int-literal.tact similarity index 100% rename from src/grammar/test/expr-int-literal.tact rename to src/050-grammar/test/expr-int-literal.tact diff --git a/src/grammar/test/expr-is-value.spec.ts b/src/050-grammar/test/expr-is-value.spec.ts similarity index 100% rename from src/grammar/test/expr-is-value.spec.ts rename to src/050-grammar/test/expr-is-value.spec.ts diff --git a/src/grammar/test/expr-nested-conditional.tact b/src/050-grammar/test/expr-nested-conditional.tact similarity index 100% rename from src/grammar/test/expr-nested-conditional.tact rename to src/050-grammar/test/expr-nested-conditional.tact diff --git a/src/grammar/test/expr-parens.tact b/src/050-grammar/test/expr-parens.tact similarity index 100% rename from src/grammar/test/expr-parens.tact rename to src/050-grammar/test/expr-parens.tact diff --git a/src/grammar/test/expr-with-unbox.tact b/src/050-grammar/test/expr-with-unbox.tact similarity index 100% rename from src/grammar/test/expr-with-unbox.tact rename to src/050-grammar/test/expr-with-unbox.tact diff --git a/src/grammar/test/expr-with-var.tact b/src/050-grammar/test/expr-with-var.tact similarity index 100% rename from src/grammar/test/expr-with-var.tact rename to src/050-grammar/test/expr-with-var.tact diff --git a/src/grammar/test/items-asm-funs.tact b/src/050-grammar/test/items-asm-funs.tact similarity index 100% rename from src/grammar/test/items-asm-funs.tact rename to src/050-grammar/test/items-asm-funs.tact diff --git a/src/grammar/test/items-method-def-initof-trailing-comma-shifts.tact b/src/050-grammar/test/items-method-def-initof-trailing-comma-shifts.tact similarity index 100% rename from src/grammar/test/items-method-def-initof-trailing-comma-shifts.tact rename to src/050-grammar/test/items-method-def-initof-trailing-comma-shifts.tact diff --git a/src/grammar/test/items-multi-funs.tact b/src/050-grammar/test/items-multi-funs.tact similarity index 100% rename from src/grammar/test/items-multi-funs.tact rename to src/050-grammar/test/items-multi-funs.tact diff --git a/src/grammar/test/items-native-fun-decls.tact b/src/050-grammar/test/items-native-fun-decls.tact similarity index 100% rename from src/grammar/test/items-native-fun-decls.tact rename to src/050-grammar/test/items-native-fun-decls.tact diff --git a/src/grammar/test/items-native-fun-funcid.tact b/src/050-grammar/test/items-native-fun-funcid.tact similarity index 100% rename from src/grammar/test/items-native-fun-funcid.tact rename to src/050-grammar/test/items-native-fun-funcid.tact diff --git a/src/grammar/test/items-struct-msg-fun-const.tact b/src/050-grammar/test/items-struct-msg-fun-const.tact similarity index 100% rename from src/grammar/test/items-struct-msg-fun-const.tact rename to src/050-grammar/test/items-struct-msg-fun-const.tact diff --git a/src/grammar/test/literals-int-underscores-bin-dec-hex-oct.tact b/src/050-grammar/test/literals-int-underscores-bin-dec-hex-oct.tact similarity index 100% rename from src/grammar/test/literals-int-underscores-bin-dec-hex-oct.tact rename to src/050-grammar/test/literals-int-underscores-bin-dec-hex-oct.tact diff --git a/src/grammar/test/stmt-augmented-assign-arith.tact b/src/050-grammar/test/stmt-augmented-assign-arith.tact similarity index 100% rename from src/grammar/test/stmt-augmented-assign-arith.tact rename to src/050-grammar/test/stmt-augmented-assign-arith.tact diff --git a/src/grammar/test/stmt-augmented-assign-bitwise.tact b/src/050-grammar/test/stmt-augmented-assign-bitwise.tact similarity index 100% rename from src/grammar/test/stmt-augmented-assign-bitwise.tact rename to src/050-grammar/test/stmt-augmented-assign-bitwise.tact diff --git a/src/grammar/test/stmt-augmented-assign-logic.tact b/src/050-grammar/test/stmt-augmented-assign-logic.tact similarity index 100% rename from src/grammar/test/stmt-augmented-assign-logic.tact rename to src/050-grammar/test/stmt-augmented-assign-logic.tact diff --git a/src/grammar/test/stmt-destructuring.tact b/src/050-grammar/test/stmt-destructuring.tact similarity index 100% rename from src/grammar/test/stmt-destructuring.tact rename to src/050-grammar/test/stmt-destructuring.tact diff --git a/src/grammar/test/stmt-if-else.tact b/src/050-grammar/test/stmt-if-else.tact similarity index 100% rename from src/grammar/test/stmt-if-else.tact rename to src/050-grammar/test/stmt-if-else.tact diff --git a/src/grammar/test/stmt-if.tact b/src/050-grammar/test/stmt-if.tact similarity index 100% rename from src/grammar/test/stmt-if.tact rename to src/050-grammar/test/stmt-if.tact diff --git a/src/grammar/test/stmt-optional-semicolon-for-last-statement.tact b/src/050-grammar/test/stmt-optional-semicolon-for-last-statement.tact similarity index 100% rename from src/grammar/test/stmt-optional-semicolon-for-last-statement.tact rename to src/050-grammar/test/stmt-optional-semicolon-for-last-statement.tact diff --git a/src/grammar/test/stmt-while-loop.tact b/src/050-grammar/test/stmt-while-loop.tact similarity index 100% rename from src/grammar/test/stmt-while-loop.tact rename to src/050-grammar/test/stmt-while-loop.tact diff --git a/src/grammar/test/stmt-while-repeat-do-loops.tact b/src/050-grammar/test/stmt-while-repeat-do-loops.tact similarity index 100% rename from src/grammar/test/stmt-while-repeat-do-loops.tact rename to src/050-grammar/test/stmt-while-repeat-do-loops.tact diff --git a/src/grammar/test/struct-field-punning.tact b/src/050-grammar/test/struct-field-punning.tact similarity index 100% rename from src/grammar/test/struct-field-punning.tact rename to src/050-grammar/test/struct-field-punning.tact diff --git a/src/grammar/test/struct-msg-as.tact b/src/050-grammar/test/struct-msg-as.tact similarity index 100% rename from src/grammar/test/struct-msg-as.tact rename to src/050-grammar/test/struct-msg-as.tact diff --git a/src/grammar/test/struct-msg-initializers.tact b/src/050-grammar/test/struct-msg-initializers.tact similarity index 100% rename from src/grammar/test/struct-msg-initializers.tact rename to src/050-grammar/test/struct-msg-initializers.tact diff --git a/src/grammar/test/struct-msg-trailing-semicolon.tact b/src/050-grammar/test/struct-msg-trailing-semicolon.tact similarity index 100% rename from src/grammar/test/struct-msg-trailing-semicolon.tact rename to src/050-grammar/test/struct-msg-trailing-semicolon.tact diff --git a/src/grammar/test/trait-optional-semicolon-for-last-const-decl.tact b/src/050-grammar/test/trait-optional-semicolon-for-last-const-decl.tact similarity index 100% rename from src/grammar/test/trait-optional-semicolon-for-last-const-decl.tact rename to src/050-grammar/test/trait-optional-semicolon-for-last-const-decl.tact diff --git a/src/grammar/test/trait-optional-semicolon-for-last-fun-decl.tact b/src/050-grammar/test/trait-optional-semicolon-for-last-fun-decl.tact similarity index 100% rename from src/grammar/test/trait-optional-semicolon-for-last-fun-decl.tact rename to src/050-grammar/test/trait-optional-semicolon-for-last-fun-decl.tact diff --git a/src/grammar/test/traits-inheritance-trailing-comma.tact b/src/050-grammar/test/traits-inheritance-trailing-comma.tact similarity index 100% rename from src/grammar/test/traits-inheritance-trailing-comma.tact rename to src/050-grammar/test/traits-inheritance-trailing-comma.tact diff --git a/src/grammar/test/type-struct-with-map.tact b/src/050-grammar/test/type-struct-with-map.tact similarity index 100% rename from src/grammar/test/type-struct-with-map.tact rename to src/050-grammar/test/type-struct-with-map.tact diff --git a/src/grammar/test/types-optional.tact b/src/050-grammar/test/types-optional.tact similarity index 100% rename from src/grammar/test/types-optional.tact rename to src/050-grammar/test/types-optional.tact diff --git a/src/abi/AbiFunction.ts b/src/abi/AbiFunction.ts index 502702cd4..d25e24b21 100644 --- a/src/abi/AbiFunction.ts +++ b/src/abi/AbiFunction.ts @@ -1,8 +1,8 @@ -import { AstExpression } from "../grammar/ast"; +import { AstExpression } from "../050-grammar/ast"; import { CompilerContext } from "../010-pipeline/context"; import { WriterContext } from "../generator/Writer"; import { TypeRef } from "../types/types"; -import { SrcInfo } from "../grammar"; +import { SrcInfo } from "../050-grammar"; export type AbiFunction = { name: string; diff --git a/src/abi/map.ts b/src/abi/map.ts index 5da7e1f07..7fa83cfaf 100644 --- a/src/abi/map.ts +++ b/src/abi/map.ts @@ -1,5 +1,5 @@ import { CompilerContext } from "../010-pipeline/context"; -import { SrcInfo } from "../grammar"; +import { SrcInfo } from "../050-grammar"; import { TypeRef } from "../types/types"; import { WriterContext } from "../generator/Writer"; import { ops } from "../generator/writers/ops"; @@ -7,7 +7,7 @@ import { writeExpression } from "../generator/writers/writeExpression"; import { throwCompilationError } from "../030-error/errors"; import { getType } from "../types/resolveDescriptors"; import { AbiFunction } from "./AbiFunction"; -import { AstExpression } from "../grammar/ast"; +import { AstExpression } from "../050-grammar/ast"; // Helper functions to avoid redundancy function checkArgumentsLength( diff --git a/src/bindings/writeTypescript.ts b/src/bindings/writeTypescript.ts index ab934b795..584a66df2 100644 --- a/src/bindings/writeTypescript.ts +++ b/src/bindings/writeTypescript.ts @@ -21,7 +21,7 @@ import { getAllocationOperationFromField, } from "../storage/allocator"; import { serializers } from "./typescript/serializers"; -import { eqNames } from "../grammar/ast"; +import { eqNames } from "../050-grammar/ast"; function writeArguments(args: ABIArgument[]) { const res: string[] = []; diff --git a/src/generator/createABI.ts b/src/generator/createABI.ts index a9d21869e..c874ec31e 100644 --- a/src/generator/createABI.ts +++ b/src/generator/createABI.ts @@ -1,7 +1,7 @@ import { ABIGetter, ABIReceiver, ABIType, ContractABI } from "@ton/core"; import { contractErrors } from "../abi/errors"; import { CompilerContext } from "../010-pipeline/context"; -import { idText } from "../grammar/ast"; +import { idText } from "../050-grammar/ast"; import { getSupportedInterfaces } from "../types/getSupportedInterfaces"; import { createABITypeRefFromTypeRef } from "../types/resolveABITypeRef"; import { getAllTypes } from "../types/resolveDescriptors"; diff --git a/src/generator/writeProgram.ts b/src/generator/writeProgram.ts index 990cf7b24..d17b4dbef 100644 --- a/src/generator/writeProgram.ts +++ b/src/generator/writeProgram.ts @@ -18,7 +18,7 @@ import { writeAccessors } from "./writers/writeAccessors"; import { ContractABI } from "@ton/core"; import { writeFunction } from "./writers/writeFunction"; import { calculateIPFSlink } from "../utils/calculateIPFSlink"; -import { getRawAST } from "../grammar/store"; +import { getRawAST } from "../050-grammar/store"; import { emit } from "./emitter/emit"; import { writeInit, diff --git a/src/generator/writers/id.ts b/src/generator/writers/id.ts index 50c55372d..ad400d9ad 100644 --- a/src/generator/writers/id.ts +++ b/src/generator/writers/id.ts @@ -1,4 +1,4 @@ -import { AstId, idText } from "../../grammar/ast"; +import { AstId, idText } from "../../050-grammar/ast"; export function funcIdOf(ident: AstId | string): string { if (typeof ident === "string") { diff --git a/src/generator/writers/resolveFuncType.spec.ts b/src/generator/writers/resolveFuncType.spec.ts index ab0b38413..a40cd9194 100644 --- a/src/generator/writers/resolveFuncType.spec.ts +++ b/src/generator/writers/resolveFuncType.spec.ts @@ -1,11 +1,11 @@ -import { getAstFactory } from "../../grammar/ast"; +import { getAstFactory } from "../../050-grammar/ast"; import { resolveDescriptors } from "../../types/resolveDescriptors"; import { WriterContext } from "../Writer"; import { resolveFuncType } from "./resolveFuncType"; -import { openContext } from "../../grammar/store"; +import { openContext } from "../../050-grammar/store"; import { CompilerContext } from "../../010-pipeline/context"; -import { getParser } from "../../grammar"; -import { defaultParser } from "../../grammar/grammar"; +import { getParser } from "../../050-grammar"; +import { defaultParser } from "../../050-grammar/grammar"; const primitiveCode = ` primitive Int; diff --git a/src/generator/writers/writeAccessors.ts b/src/generator/writers/writeAccessors.ts index dab34430f..e2f4f3260 100644 --- a/src/generator/writers/writeAccessors.ts +++ b/src/generator/writers/writeAccessors.ts @@ -1,6 +1,6 @@ import { contractErrors } from "../../abi/errors"; import { maxTupleSize } from "../../bindings/typescript/writeStruct"; -import { ItemOrigin } from "../../grammar"; +import { ItemOrigin } from "../../050-grammar"; import { getType } from "../../types/resolveDescriptors"; import { TypeDescription } from "../../types/types"; import { WriterContext } from "../Writer"; diff --git a/src/generator/writers/writeContract.ts b/src/generator/writers/writeContract.ts index 2b5eeb1e9..14867da2c 100644 --- a/src/generator/writers/writeContract.ts +++ b/src/generator/writers/writeContract.ts @@ -4,7 +4,7 @@ import { enabledInterfacesGetter, enabledIpfsAbiGetter, } from "../../000-config/features"; -import { ItemOrigin } from "../../grammar"; +import { ItemOrigin } from "../../050-grammar"; import { InitDescription, TypeDescription } from "../../types/types"; import { WriterContext } from "../Writer"; import { funcIdOf, funcInitIdOf } from "./id"; diff --git a/src/generator/writers/writeExpression.spec.ts b/src/generator/writers/writeExpression.spec.ts index 37ca8232f..3e944e2e9 100644 --- a/src/generator/writers/writeExpression.spec.ts +++ b/src/generator/writers/writeExpression.spec.ts @@ -4,12 +4,12 @@ import { } from "../../types/resolveDescriptors"; import { WriterContext } from "../Writer"; import { writeExpression } from "./writeExpression"; -import { openContext } from "../../grammar/store"; +import { openContext } from "../../050-grammar/store"; import { resolveStatements } from "../../types/resolveStatements"; import { CompilerContext } from "../../010-pipeline/context"; -import { getParser } from "../../grammar"; -import { getAstFactory } from "../../grammar/ast"; -import { defaultParser } from "../../grammar/grammar"; +import { getParser } from "../../050-grammar"; +import { getAstFactory } from "../../050-grammar/ast"; +import { defaultParser } from "../../050-grammar/grammar"; const code = ` diff --git a/src/generator/writers/writeExpression.ts b/src/generator/writers/writeExpression.ts index 68a136420..08512b8b3 100644 --- a/src/generator/writers/writeExpression.ts +++ b/src/generator/writers/writeExpression.ts @@ -4,7 +4,7 @@ import { eqNames, idText, tryExtractPath, -} from "../../grammar/ast"; +} from "../../050-grammar/ast"; import { idTextErr, TactConstEvalError, diff --git a/src/generator/writers/writeFunction.ts b/src/generator/writers/writeFunction.ts index 0c8a43ebf..0083d92b1 100644 --- a/src/generator/writers/writeFunction.ts +++ b/src/generator/writers/writeFunction.ts @@ -8,7 +8,7 @@ import { idText, isWildcard, tryExtractPath, -} from "../../grammar/ast"; +} from "../../050-grammar/ast"; import { getType, resolveTypeRef } from "../../types/resolveDescriptors"; import { getExpType } from "../../types/resolveExpression"; import { FunctionDescription, TypeRef } from "../../types/types"; diff --git a/src/generator/writers/writeRouter.ts b/src/generator/writers/writeRouter.ts index 82f2e3861..5db8747c2 100644 --- a/src/generator/writers/writeRouter.ts +++ b/src/generator/writers/writeRouter.ts @@ -7,7 +7,7 @@ import { ops } from "./ops"; import { resolveFuncType } from "./resolveFuncType"; import { resolveFuncTypeUnpack } from "./resolveFuncTypeUnpack"; import { writeStatement } from "./writeFunction"; -import { AstNumber } from "../../grammar/ast"; +import { AstNumber } from "../../050-grammar/ast"; export function commentPseudoOpcode(comment: string): string { return beginCell() diff --git a/src/generator/writers/writeSerialization.spec.ts b/src/generator/writers/writeSerialization.spec.ts index 0f58cdcaa..de6695c00 100644 --- a/src/generator/writers/writeSerialization.spec.ts +++ b/src/generator/writers/writeSerialization.spec.ts @@ -11,11 +11,11 @@ import { import { WriterContext } from "../Writer"; import { writeParser, writeSerializer } from "./writeSerialization"; import { writeStdlib } from "./writeStdlib"; -import { openContext } from "../../grammar/store"; +import { openContext } from "../../050-grammar/store"; import { writeAccessors } from "./writeAccessors"; -import { getParser } from "../../grammar"; -import { getAstFactory } from "../../grammar/ast"; -import { defaultParser } from "../../grammar/grammar"; +import { getParser } from "../../050-grammar"; +import { getAstFactory } from "../../050-grammar/ast"; +import { defaultParser } from "../../050-grammar/grammar"; const code = ` primitive Int; diff --git a/src/generator/writers/writeSerialization.ts b/src/generator/writers/writeSerialization.ts index 3b8223b4a..810047cd7 100644 --- a/src/generator/writers/writeSerialization.ts +++ b/src/generator/writers/writeSerialization.ts @@ -1,6 +1,6 @@ import { contractErrors } from "../../abi/errors"; import { throwInternalCompilerError } from "../../030-error/errors"; -import { dummySrcInfo, ItemOrigin } from "../../grammar"; +import { dummySrcInfo, ItemOrigin } from "../../050-grammar"; import { AllocationCell, AllocationOperation } from "../../storage/operation"; import { StorageAllocation } from "../../storage/StorageAllocation"; import { getType } from "../../types/resolveDescriptors"; diff --git a/src/index.ts b/src/index.ts index 591f88bc4..78afabaaa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,7 +12,7 @@ export { projectSchema, configSchema, } from "./000-config/parseConfig"; -export { AstSorter } from "./grammar/sort"; -export { AstRenamer } from "./grammar/rename"; -export { AstHasher } from "./grammar/hash"; -export { AstComparator } from "./grammar/compare"; +export { AstSorter } from "./050-grammar/sort"; +export { AstRenamer } from "./050-grammar/rename"; +export { AstHasher } from "./050-grammar/hash"; +export { AstComparator } from "./050-grammar/compare"; diff --git a/src/interpreter/constEval.ts b/src/interpreter/constEval.ts index fc50f9526..f2e49d56f 100644 --- a/src/interpreter/constEval.ts +++ b/src/interpreter/constEval.ts @@ -5,7 +5,7 @@ import { AstUnaryOperation, AstValue, isValue, -} from "../grammar/ast"; +} from "../050-grammar/ast"; import { TactConstEvalError } from "../030-error/errors"; import { Value } from "../types/types"; import { AstUtil, extractValue } from "../optimizer/util"; @@ -19,7 +19,7 @@ import { evalUnaryOp, throwNonFatalErrorConstEval, } from "./interpreter"; -import { SrcInfo } from "../grammar"; +import { SrcInfo } from "../050-grammar"; // Utility Exception class to interrupt the execution // of functions that cannot evaluate a tree fully into a value. diff --git a/src/interpreter/interpreter.ts b/src/interpreter/interpreter.ts index 8aac4dcf4..d7ef6ef43 100644 --- a/src/interpreter/interpreter.ts +++ b/src/interpreter/interpreter.ts @@ -55,8 +55,8 @@ import { getAstFactory, idText, isSelfId, -} from "../grammar/ast"; -import { SrcInfo, dummySrcInfo, Parser, getParser } from "../grammar"; +} from "../050-grammar/ast"; +import { SrcInfo, dummySrcInfo, Parser, getParser } from "../050-grammar"; import { divFloor, modFloor } from "../optimizer/util"; import { getStaticConstant, @@ -74,7 +74,7 @@ import { showValue, } from "../types/types"; import { sha256_sync } from "@ton/crypto"; -import { defaultParser } from "../grammar/grammar"; +import { defaultParser } from "../050-grammar/grammar"; // TVM integers are signed 257-bit integers const minTvmInt: bigint = -(2n ** 256n); diff --git a/src/optimizer/algebraic.ts b/src/optimizer/algebraic.ts index bfde705b7..249e9fb5c 100644 --- a/src/optimizer/algebraic.ts +++ b/src/optimizer/algebraic.ts @@ -5,7 +5,7 @@ import { AstOpUnary, eqExpressions, isValue, -} from "../grammar/ast"; +} from "../050-grammar/ast"; import { ExpressionTransformer, Rule } from "./types"; import { checkIsBinaryOpNode, diff --git a/src/optimizer/associative.ts b/src/optimizer/associative.ts index 55491e009..a459e1015 100644 --- a/src/optimizer/associative.ts +++ b/src/optimizer/associative.ts @@ -6,7 +6,7 @@ import { AstOpBinary, AstValue, isValue, -} from "../grammar/ast"; +} from "../050-grammar/ast"; import * as interpreterModule from "../interpreter/interpreter"; import { Value } from "../types/types"; import { ExpressionTransformer, Rule } from "./types"; diff --git a/src/optimizer/standardOptimizer.ts b/src/optimizer/standardOptimizer.ts index 7df2b4ed9..eebae24aa 100644 --- a/src/optimizer/standardOptimizer.ts +++ b/src/optimizer/standardOptimizer.ts @@ -1,4 +1,4 @@ -import { AstExpression } from "../grammar/ast"; +import { AstExpression } from "../050-grammar/ast"; import { AddSelf, AddZero, diff --git a/src/optimizer/test/partial-eval.spec.ts b/src/optimizer/test/partial-eval.spec.ts index b46624f52..88bf72a74 100644 --- a/src/optimizer/test/partial-eval.spec.ts +++ b/src/optimizer/test/partial-eval.spec.ts @@ -5,15 +5,15 @@ import { eqExpressions, getAstFactory, isValue, -} from "../../grammar/ast"; +} from "../../050-grammar/ast"; import { AstUtil, extractValue, getAstUtil } from "../util"; import { getOptimizer } from "../../interpreter/constEval"; import { CompilerContext } from "../../010-pipeline/context"; import { ExpressionTransformer, Rule } from "../types"; import { AssociativeRule3 } from "../associative"; import { evalBinaryOp, evalUnaryOp } from "../../interpreter/interpreter"; -import { getParser } from "../../grammar"; -import { defaultParser } from "../../grammar/grammar"; +import { getParser } from "../../050-grammar"; +import { defaultParser } from "../../050-grammar/grammar"; const MAX: string = "115792089237316195423570985008687907853269984665640564039457584007913129639935"; diff --git a/src/optimizer/types.ts b/src/optimizer/types.ts index d4011c138..37642ab5c 100644 --- a/src/optimizer/types.ts +++ b/src/optimizer/types.ts @@ -1,4 +1,4 @@ -import { AstExpression } from "../grammar/ast"; +import { AstExpression } from "../050-grammar/ast"; import { AstUtil } from "./util"; export interface ExpressionTransformer { diff --git a/src/optimizer/util.ts b/src/optimizer/util.ts index 0bfa18442..15a75f828 100644 --- a/src/optimizer/util.ts +++ b/src/optimizer/util.ts @@ -5,8 +5,8 @@ import { AstValue, isValue, FactoryAst, -} from "../grammar/ast"; -import { dummySrcInfo } from "../grammar"; +} from "../050-grammar/ast"; +import { dummySrcInfo } from "../050-grammar"; import { throwInternalCompilerError } from "../030-error/errors"; import { Value } from "../types/types"; diff --git a/src/prettyPrinter.ts b/src/prettyPrinter.ts index 04f9a441f..5e3797906 100644 --- a/src/prettyPrinter.ts +++ b/src/prettyPrinter.ts @@ -1,4 +1,4 @@ -import * as A from "./grammar/ast"; +import * as A from "./050-grammar/ast"; import { groupBy, intercalate, isUndefined } from "./utils/array"; import { makeVisitor } from "./utils/tricks"; diff --git a/src/storage/resolveAllocation.spec.ts b/src/storage/resolveAllocation.spec.ts index 651292b9a..e55bc9638 100644 --- a/src/storage/resolveAllocation.spec.ts +++ b/src/storage/resolveAllocation.spec.ts @@ -1,14 +1,14 @@ import fs from "fs"; import { resolveDescriptors } from "../types/resolveDescriptors"; import { getAllocations, resolveAllocations } from "./resolveAllocation"; -import { openContext } from "../grammar/store"; +import { openContext } from "../050-grammar/store"; import { resolveStatements } from "../types/resolveStatements"; import { CompilerContext } from "../010-pipeline/context"; import { resolveSignatures } from "../types/resolveSignatures"; import path from "path"; -import { getParser } from "../grammar"; -import { getAstFactory } from "../grammar/ast"; -import { defaultParser } from "../grammar/grammar"; +import { getParser } from "../050-grammar"; +import { getAstFactory } from "../050-grammar/ast"; +import { defaultParser } from "../050-grammar/grammar"; const stdlibPath = path.resolve(__dirname, "../../stdlib/std/primitives.tact"); const stdlib = fs.readFileSync(stdlibPath, "utf-8"); diff --git a/src/storage/resolveAllocation.ts b/src/storage/resolveAllocation.ts index 1aaf2da99..5bcc01fce 100644 --- a/src/storage/resolveAllocation.ts +++ b/src/storage/resolveAllocation.ts @@ -8,7 +8,7 @@ import { allocate, getAllocationOperationFromField } from "./allocator"; import { createABITypeRefFromTypeRef } from "../types/resolveABITypeRef"; import { funcInitIdOf } from "../generator/writers/id"; import { throwInternalCompilerError } from "../030-error/errors"; -import { idText } from "../grammar/ast"; +import { idText } from "../050-grammar/ast"; const store = createContextStore(); diff --git a/src/test/compare.spec.ts b/src/test/compare.spec.ts index c8e0fcca7..e397df97b 100644 --- a/src/test/compare.spec.ts +++ b/src/test/compare.spec.ts @@ -1,11 +1,11 @@ import fs from "fs"; -import { getParser } from "../grammar"; +import { getParser } from "../050-grammar"; import { join } from "path"; -import { AstComparator } from "../grammar/compare"; +import { AstComparator } from "../050-grammar/compare"; import { CONTRACTS_DIR } from "./util"; import * as assert from "assert"; -import { getAstFactory } from "../grammar/ast"; -import { defaultParser } from "../grammar/grammar"; +import { getAstFactory } from "../050-grammar/ast"; +import { defaultParser } from "../050-grammar/grammar"; describe("comparator", () => { it.each(fs.readdirSync(CONTRACTS_DIR, { withFileTypes: true }))( diff --git a/src/test/prettyPrinter.spec.ts b/src/test/prettyPrinter.spec.ts index 832dbf455..c5e6af5e1 100644 --- a/src/test/prettyPrinter.spec.ts +++ b/src/test/prettyPrinter.spec.ts @@ -1,12 +1,12 @@ import fs from "fs"; import { prettyPrint } from "../prettyPrinter"; -import { getParser } from "../grammar"; +import { getParser } from "../050-grammar"; import { join } from "path"; import { trimTrailingCR, CONTRACTS_DIR } from "./util"; import * as assert from "assert"; import JSONBig from "json-bigint"; -import { getAstFactory } from "../grammar/ast"; -import { defaultParser } from "../grammar/grammar"; +import { getAstFactory } from "../050-grammar/ast"; +import { defaultParser } from "../050-grammar/grammar"; describe("formatter", () => { it.each(fs.readdirSync(CONTRACTS_DIR, { withFileTypes: true }))( diff --git a/src/test/rename.spec.ts b/src/test/rename.spec.ts index c49e7b94a..7d64fcd5f 100644 --- a/src/test/rename.spec.ts +++ b/src/test/rename.spec.ts @@ -1,12 +1,12 @@ import fs from "fs"; import { join } from "path"; -import { AstRenamer } from "../grammar/rename"; +import { AstRenamer } from "../050-grammar/rename"; import { prettyPrint } from "../prettyPrinter"; import { trimTrailingCR, CONTRACTS_DIR } from "./util"; import * as assert from "assert"; -import { getParser } from "../grammar"; -import { getAstFactory } from "../grammar/ast"; -import { defaultParser } from "../grammar/grammar"; +import { getParser } from "../050-grammar"; +import { getAstFactory } from "../050-grammar/ast"; +import { defaultParser } from "../050-grammar/grammar"; const EXPECTED_DIR = join(CONTRACTS_DIR, "renamer-expected"); diff --git a/src/types/resolveABITypeRef.ts b/src/types/resolveABITypeRef.ts index ce4e7b12f..362718db5 100644 --- a/src/types/resolveABITypeRef.ts +++ b/src/types/resolveABITypeRef.ts @@ -12,7 +12,7 @@ import { isSlice, isString, isStringBuilder, -} from "../grammar/ast"; +} from "../050-grammar/ast"; import { idTextErr, throwCompilationError, @@ -21,7 +21,7 @@ import { import { TypeRef } from "./types"; import { CompilerContext } from "../010-pipeline/context"; import { getType } from "./resolveDescriptors"; -import { SrcInfo } from "../grammar"; +import { SrcInfo } from "../050-grammar"; type FormatDef = Record< string, diff --git a/src/types/resolveDescriptors.spec.ts b/src/types/resolveDescriptors.spec.ts index 19223b95c..bee6d9a4b 100644 --- a/src/types/resolveDescriptors.spec.ts +++ b/src/types/resolveDescriptors.spec.ts @@ -6,12 +6,12 @@ import { } from "./resolveDescriptors"; import { resolveSignatures } from "./resolveSignatures"; import { loadCases } from "../utils/loadCases"; -import { openContext } from "../grammar/store"; +import { openContext } from "../050-grammar/store"; import { featureEnable } from "../000-config/features"; -import { getParser, SrcInfo } from "../grammar"; -import { getAstFactory } from "../grammar/ast"; -import { isSrcInfo } from "../grammar/src-info"; -import { defaultParser } from "../grammar/grammar"; +import { getParser, SrcInfo } from "../050-grammar"; +import { getAstFactory } from "../050-grammar/ast"; +import { isSrcInfo } from "../050-grammar/src-info"; +import { defaultParser } from "../050-grammar/grammar"; expect.addSnapshotSerializer({ test: (src) => isSrcInfo(src), diff --git a/src/types/resolveDescriptors.ts b/src/types/resolveDescriptors.ts index 12acccb91..016d6fa88 100644 --- a/src/types/resolveDescriptors.ts +++ b/src/types/resolveDescriptors.ts @@ -18,8 +18,8 @@ import { AstTypeId, AstAsmFunctionDef, FactoryAst, -} from "../grammar/ast"; -import { traverse } from "../grammar/iterators"; +} from "../050-grammar/ast"; +import { traverse } from "../050-grammar/iterators"; import { idTextErr, throwCompilationError, @@ -40,8 +40,8 @@ import { TypeRef, typeRefEquals, } from "./types"; -import { getRawAST } from "../grammar/store"; -import { cloneNode } from "../grammar/clone"; +import { getRawAST } from "../050-grammar/store"; +import { cloneNode } from "../050-grammar/clone"; import { crc16 } from "../utils/crc16"; import { isSubsetOf } from "../utils/isSubsetOf"; import { evalConstantExpression } from "../interpreter/constEval"; @@ -53,7 +53,7 @@ import { import { enabledExternals } from "../000-config/features"; import { isRuntimeType } from "./isRuntimeType"; import { GlobalFunctions } from "../abi/global"; -import { ItemOrigin } from "../grammar"; +import { ItemOrigin } from "../050-grammar"; import { getExpType, resolveExpression } from "./resolveExpression"; import { emptyContext } from "./resolveStatements"; import { isAssignable } from "./subtyping"; diff --git a/src/types/resolveErrors.ts b/src/types/resolveErrors.ts index fe81981ad..ff74b4b46 100644 --- a/src/types/resolveErrors.ts +++ b/src/types/resolveErrors.ts @@ -1,7 +1,7 @@ import { sha256_sync } from "@ton/crypto"; import { CompilerContext, createContextStore } from "../010-pipeline/context"; -import { AstNode, isRequire } from "../grammar/ast"; -import { traverse } from "../grammar/iterators"; +import { AstNode, isRequire } from "../050-grammar/ast"; +import { traverse } from "../050-grammar/iterators"; import { evalConstantExpression } from "../interpreter/constEval"; import { throwInternalCompilerError } from "../030-error/errors"; import { diff --git a/src/types/resolveExpression.ts b/src/types/resolveExpression.ts index 04efabd21..d889a347b 100644 --- a/src/types/resolveExpression.ts +++ b/src/types/resolveExpression.ts @@ -15,7 +15,7 @@ import { eqNames, idText, isWildcard, -} from "../grammar/ast"; +} from "../050-grammar/ast"; import { idTextErr, throwCompilationError } from "../030-error/errors"; import { CompilerContext, createContextStore } from "../010-pipeline/context"; import { diff --git a/src/types/resolveSignatures.ts b/src/types/resolveSignatures.ts index f26bf9cad..5a15671c3 100644 --- a/src/types/resolveSignatures.ts +++ b/src/types/resolveSignatures.ts @@ -14,10 +14,10 @@ import { ReceiverDescription, } from "./types"; import { throwCompilationError } from "../030-error/errors"; -import { AstNumber, AstReceiver } from "../grammar/ast"; +import { AstNumber, AstReceiver } from "../050-grammar/ast"; import { commentPseudoOpcode } from "../generator/writers/writeRouter"; import { sha256_sync } from "@ton/crypto"; -import { dummySrcInfo } from "../grammar"; +import { dummySrcInfo } from "../050-grammar"; import { ensureInt } from "../interpreter/interpreter"; import { evalConstantExpression } from "../interpreter/constEval"; diff --git a/src/types/resolveStatements.spec.ts b/src/types/resolveStatements.spec.ts index e8f41cb35..9ec237ab3 100644 --- a/src/types/resolveStatements.spec.ts +++ b/src/types/resolveStatements.spec.ts @@ -1,13 +1,13 @@ import { getAllExpressionTypes } from "./resolveExpression"; import { resolveDescriptors } from "./resolveDescriptors"; import { loadCases } from "../utils/loadCases"; -import { openContext } from "../grammar/store"; +import { openContext } from "../050-grammar/store"; import { resolveStatements } from "./resolveStatements"; import { CompilerContext } from "../010-pipeline/context"; import { featureEnable } from "../000-config/features"; -import { getParser } from "../grammar"; -import { getAstFactory } from "../grammar/ast"; -import { defaultParser } from "../grammar/grammar"; +import { getParser } from "../050-grammar"; +import { getAstFactory } from "../050-grammar/ast"; +import { defaultParser } from "../050-grammar/grammar"; describe("resolveStatements", () => { for (const r of loadCases(__dirname + "/stmts/")) { diff --git a/src/types/resolveStatements.ts b/src/types/resolveStatements.ts index 2ef722c09..c488095e9 100644 --- a/src/types/resolveStatements.ts +++ b/src/types/resolveStatements.ts @@ -9,7 +9,7 @@ import { selfId, isSelfId, eqNames, -} from "../grammar/ast"; +} from "../050-grammar/ast"; import { isAssignable } from "./subtyping"; import { idTextErr, @@ -30,7 +30,7 @@ import { FunctionDescription, printTypeRef, TypeRef } from "./types"; import { evalConstantExpression } from "../interpreter/constEval"; import { ensureInt } from "../interpreter/interpreter"; import { crc16 } from "../utils/crc16"; -import { SrcInfo } from "../grammar"; +import { SrcInfo } from "../050-grammar"; export type StatementContext = { root: SrcInfo; diff --git a/src/types/types.ts b/src/types/types.ts index c1957e742..f14206d4c 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -13,8 +13,8 @@ import { AstFieldDecl, AstAsmFunctionDef, AstNumber, -} from "../grammar/ast"; -import { dummySrcInfo, ItemOrigin, SrcInfo } from "../grammar"; +} from "../050-grammar/ast"; +import { dummySrcInfo, ItemOrigin, SrcInfo } from "../050-grammar"; export type TypeDescription = { kind: "struct" | "primitive_type_decl" | "contract" | "trait"; From c45ba3a774ce291a9b2391c6d2129d7178b195b0 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:42:36 +0400 Subject: [PATCH 10/26] move types --- CONTRIBUTING.md | 14 +++++++------- src/010-pipeline/build.ts | 4 ++-- src/010-pipeline/precompile.ts | 10 +++++----- src/{storage => 060-types}/StorageAllocation.ts | 0 .../__snapshots__/resolveAllocation.spec.ts.snap | 0 .../__snapshots__/resolveDescriptors.spec.ts.snap | 0 .../__snapshots__/resolveStatements.spec.ts.snap | 0 src/{storage => 060-types}/allocator.ts | 0 src/{types => 060-types}/getSupportedInterfaces.ts | 0 src/{types => 060-types}/isRuntimeType.ts | 0 src/{storage => 060-types}/operation.ts | 0 src/{types => 060-types}/resolveABITypeRef.ts | 0 .../resolveAllocation.spec.ts | 6 +++--- src/{storage => 060-types}/resolveAllocation.ts | 6 +++--- .../resolveDescriptors.spec.ts | 0 src/{types => 060-types}/resolveDescriptors.ts | 0 src/{types => 060-types}/resolveErrors.ts | 0 src/{types => 060-types}/resolveExpression.ts | 0 src/{types => 060-types}/resolveSignatures.ts | 0 src/{types => 060-types}/resolveStatements.spec.ts | 0 src/{types => 060-types}/resolveStatements.ts | 0 .../assign-augmented-const-contract.tact | 0 .../assign-augmented-const-global.tact | 0 .../assign-augmented-const-struct-contract.tact | 0 .../assign-augmented-const-struct-global.tact | 0 .../stmts-failed/assign-const-contract.tact | 0 .../stmts-failed/assign-const-global.tact | 0 .../stmts-failed/assign-const-struct-contract.tact | 0 .../stmts-failed/assign-const-struct-global.tact | 0 .../stmts-failed/bounced-type-is-smaller.tact | 0 .../contract-getter-with-method-id-1.tact | 0 .../contract-getter-with-method-id-2.tact | 0 .../stmts-failed/contract-initof-wrong-arg.tact | 0 .../stmts-failed/expr-bitwise-not-bool.tact | 0 .../expr-conditional-branch-mismatch-nested1.tact | 0 .../expr-conditional-branch-mismatch-nested2.tact | 0 .../expr-conditional-branch-mismatch.tact | 0 ...-conditional-non-optional-result-expected1.tact | 0 ...-conditional-non-optional-result-expected2.tact | 0 ...-conditional-non-optional-result-expected3.tact | 0 .../expr-conditional-result-mismatch.tact | 0 .../expr-conditional-void-branches copy.tact | 0 .../stmts-failed/expr-eq-bounced.tact | 0 .../stmts-failed/expr-eq-builder.tact | 0 .../stmts-failed/expr-eq-contract.tact | 0 .../stmts-failed/expr-eq-int-bool.tact | 0 .../stmts-failed/expr-eq-map-map.tact | 0 .../stmts-failed/expr-eq-null-1.tact | 0 .../stmts-failed/expr-eq-null-2.tact | 0 .../stmts-failed/expr-eq-null-3.tact | 0 .../stmts-failed/expr-eq-null-bounced.tact | 0 .../stmts-failed/expr-eq-optional-builder.tact | 0 .../expr-eq-optional-stringbuilder.tact | 0 .../stmts-failed/expr-eq-optional-struct-null.tact | 0 .../stmts-failed/expr-eq-optional-struct.tact | 0 .../stmts-failed/expr-eq-stringbuilder.tact | 0 .../stmts-failed/expr-eq-struct.tact | 0 .../stmts-failed/expr-eq-void-null.tact | 0 .../stmts-failed/expr-eq-void1.tact | 0 .../stmts-failed/expr-eq-void2.tact | 0 .../expr-field-does-not-exist-but-method-does.tact | 0 .../stmts-failed/expr-field-does-not-exist.tact | 0 .../expr-internal-fun-call-bool-param.tact.tact | 0 .../expr-map-del-method-is-non-void.tact | 0 .../expr-map-exists-method-not-bool.tact | 0 .../expr-map-exists-method-on-not-map.tact | 0 .../expr-method-does-not-exist-but-field-does.tact | 0 .../expr-module-fun-call-bool-param.tact | 0 .../stmts-failed/expr-struct-duplicate-field.tact | 0 .../expr-struct-impossible-field-punning.tact | 0 .../stmts-failed/expr-struct-missing-field.tact | 0 .../stmts-failed/expr-struct-wrong-field-type.tact | 0 .../stmts-failed/expr-var-int-bool.tact | 0 .../expr-wrong-arity-internal-fun.tact | 0 .../stmts-failed/expr-wrong-arity-module-fun.tact | 0 .../stmts-failed/getter-collision-trait.tact | 0 .../getter-collision-with-reserved1.tact | 0 .../getter-collision-with-reserved2.tact | 0 .../getter-collision-with-reserved3.tact | 0 .../getter-collision-with-reserved_opt1.tact | 0 .../getter-collision-with-reserved_opt2.tact | 0 .../getter-collision-with-reserved_opt3.tact | 0 .../stmts-failed/getter-collision-with-trait.tact | 0 .../stmts-failed/getter-collision.tact | 0 .../stmts-failed/init-vars-analysis-if.tact | 0 .../init-vars-analysis-implicit-init.tact | 0 .../init-vars-analysis-missing-storage-var.tact | 0 ...ysis-used-uninit-storage-augmented-assign1.tact | 0 ...ysis-used-uninit-storage-augmented-assign2.tact | 0 ...ysis-used-uninit-storage-override-fun-call.tact | 0 ...-vars-analysis-used-uninit-storage-struct1.tact | 0 ...-vars-analysis-used-uninit-storage-struct2.tact | 0 ...-analysis-used-uninit-storage-var-fun-call.tact | 0 ...init-vars-analysis-used-uninit-storage-var.tact | 0 .../init-vars-analysis-with-if-else.tact | 0 .../init-vars-analysis-with-if-elseif.tact | 0 .../stmts-failed/return-analysis-catch-if.tact | 0 .../stmts-failed/return-analysis-do-if.tact | 0 .../stmts-failed/return-analysis-if.tact | 0 .../stmts-failed/return-analysis-non-void1.tact | 0 .../stmts-failed/return-analysis-non-void2.tact | 0 .../stmts-failed/return-analysis-repeat.tact | 0 .../stmts-failed/return-analysis-separate-ifs.tact | 0 .../return-analysis-throw-wrapped.tact | 0 .../stmts-failed/return-analysis-try1.tact | 0 .../stmts-failed/return-analysis-try2.tact | 0 .../stmts-failed/return-analysis-while.tact | 0 .../stmts-failed/stmt-assgn-int-string.tact | 0 .../stmt-augmented-assgn-bool-int.tact | 0 .../stmts-failed/stmt-augmented-assgn-bool.tact | 0 .../stmt-augmented-assgn-int-bool.tact | 0 .../stmts-failed/stmt-augmented-assgn-int.tact | 0 .../stmt-augmented-assgn-not-matching.tact | 0 .../stmts-failed/stmt-augmented-assgn-string.tact | 0 .../stmt-conditional-expr-stmt-void1.tact | 0 .../stmt-destructuring-fields-duplicate-id.tact | 0 ...-destructuring-fields-non-destructable-opt.tact | 0 ...stmt-destructuring-fields-non-destructable.tact | 0 ...tmt-destructuring-fields-non-destructable2.tact | 0 ...t-destructuring-fields-non-existing-punned.tact | 0 ...-destructuring-fields-non-existing-punned2.tact | 0 ...structuring-fields-non-existing-underscore.tact | 0 .../stmt-destructuring-fields-non-existing.tact | 0 ...tmt-destructuring-fields-shadowed-const-id.tact | 0 .../stmt-destructuring-fields-shadowed-id.tact | 0 .../stmt-destructuring-fields-wrong-count.tact | 0 .../stmt-destructuring-fields-wrong-count2.tact | 0 .../stmt-destructuring-fields-wrong-type.tact | 0 .../stmts-failed/stmt-do-int.tact | 0 .../stmts-failed/stmt-foreach-non-map.tact | 0 .../stmts-failed/stmt-foreach-non-path-map.tact | 0 .../stmts-failed/stmt-if-int.tact | 0 .../stmt-let-unknown-type-inference.tact | 0 .../stmt-let-unknown-type-inference2.tact | 0 .../stmts-failed/stmt-let-void-inference.tact | 0 .../stmts-failed/stmt-let-wrong-rhs.tact | 0 .../stmts-failed/stmt-repeat-bool.tact | 0 .../stmt-return-from-try-and-catch.tact | 0 .../stmts-failed/stmt-return-void1.tact | 0 .../stmts-failed/stmt-return-void2.tact | 0 .../stmts-failed/stmt-return-void3.tact | 0 .../stmts-failed/stmt-unboxing-expr-stmt-void.tact | 0 .../stmts-failed/stmt-while-int.tact | 0 ...of-bounced-field-in-type-that-is-too-big-2.tact | 0 ...e-of-bounced-field-in-type-that-is-too-big.tact | 0 .../usage-of-bounced-field-that-is-too-big.tact | 0 .../stmts-failed/var-does-not-exist.tact | 0 .../stmts-failed/var-does-not-exist2.tact | 0 .../stmts-failed/var-does-not-exist3.tact | 0 .../stmts-failed/var-does-not-exist4.tact | 0 ...ar-scope-catch-does-not-shadow-outer-const.tact | 0 .../var-scope-catch-does-not-shadow-outer-var.tact | 0 ...cope-catch-param-does-not-shadow-outer-var.tact | 0 ...ar-scope-catch-param-is-not-visible-in-try.tact | 0 .../var-scope-const-shadowing-catch.tact | 0 .../var-scope-const-shadowing-external-param.tact | 0 .../var-scope-const-shadowing-foreach.tact | 0 .../var-scope-const-shadowing-fun-param.tact | 0 .../var-scope-const-shadowing-let.tact | 0 .../var-scope-const-shadowing-receiver-param.tact | 0 .../var-scope-do-until-shadows-outer-const.tact | 0 .../var-scope-do-until-shadows-outer-var.tact | 0 .../var-scope-external-shadows-param.tact | 0 ...scope-foreach-internal-var-does-not-escape.tact | 0 .../var-scope-foreach-key-does-not-escape.tact | 0 .../var-scope-foreach-key-shadows-map.tact | 0 .../var-scope-foreach-key-shadows-outer-var.tact | 0 .../var-scope-foreach-shadows-outer-const.tact | 0 .../var-scope-foreach-shadows-outer-map.tact | 0 .../var-scope-foreach-shadows-outer-var.tact | 0 .../var-scope-foreach-val-does-not-escape.tact | 0 .../var-scope-foreach-val-shadows-const-map.tact | 0 .../var-scope-foreach-val-shadows-key.tact | 0 .../var-scope-foreach-val-shadows-map.tact | 0 .../var-scope-foreach-val-shadows-outer-var.tact | 0 .../var-scope-function-shadows-local-var.tact | 0 .../var-scope-function-shadows-param.tact | 0 .../var-scope-if-else-shadows-outer-const.tact | 0 .../var-scope-if-else-shadows-outer-var.tact | 0 .../var-scope-if-then-shadows-outer-const.tact | 0 .../var-scope-if-then-shadows-outer-var.tact | 0 ...ar-scope-local-catch-param-does-not-escape.tact | 0 .../var-scope-local-loop-var-does-not-escape.tact | 0 .../var-scope-missing-storage-var.tact | 0 .../var-scope-no-toString-global-fun1.tact | 0 .../var-scope-no-toString-global-fun2.tact | 0 .../var-scope-no-valueOf-global-fun.tact | 0 .../var-scope-rec-fun-shadowing-catch.tact | 0 .../var-scope-rec-fun-shadowing-foreach.tact | 0 .../var-scope-rec-fun-shadowing-fun-param.tact | 0 .../var-scope-rec-fun-shadowing-let.tact | 0 .../var-scope-receiver-shadows-param.tact | 0 .../var-scope-repeat-shadows-outer-const.tact | 0 .../var-scope-repeat-shadows-outer-var.tact | 0 .../var-scope-try-does-not-shadow-outer-const.tact | 0 .../var-scope-try-does-not-shadow-outer-var.tact | 0 .../var-scope-while-shadows-outer-const.tact | 0 .../var-scope-while-shadows-outer-var.tact | 0 .../stmts-failed/var-underscore-name-access.tact | 0 .../stmts-failed/var-underscore-name-access2.tact | 0 .../stmts-failed/var-underscore-name-access3.tact | 0 .../stmts-failed/wf-type-let.tact | 0 .../stmts/assign-self-mutating-method.tact | 0 .../stmts/contract-getter-with-method-id-1.tact | 0 .../stmts/contract-getter-with-method-id-2.tact | 0 .../stmts/contract-getter-with-method-id-3.tact | 0 .../stmts/contract-receiver-bounced.tact | 0 .../stmts/expr-arith-bool-cmp.tact | 0 .../stmts/expr-conditional-with-subtyping.tact | 0 src/{types => 060-types}/stmts/expr-eq-arith.tact | 0 .../stmts/expr-eq-int-optional-int.tact | 0 .../stmts/expr-eq-literal.tact | 0 .../stmts/expr-eq-map-map.tact | 0 .../stmts/expr-eq-map-null.tact | 0 .../stmts/expr-eq-null-null.tact | 0 .../stmts/expr-eq-optional-int-null.tact | 0 .../stmts/expr-eq-optional-struct-null.tact | 0 .../stmts/expr-field-access-method-call.tact | 0 .../stmts/expr-maps-del-method.tact | 0 .../stmts/expr-maps-exists-method.tact | 0 .../stmts/expr-struct-construction.tact | 0 .../stmts/fun-extends-optional.tact | 0 .../stmts/init-vars-analysis-with-if.tact | 0 .../stmts/return-analysis-if-elseif.tact | 0 .../return-analysis-if-try-catch-do-loop.tact | 0 .../stmts/return-analysis-no-return-in-void1.tact | 0 .../stmts/return-analysis-no-return-in-void2.tact | 0 .../stmts/return-analysis-throw1.tact | 0 .../stmts/return-analysis-throw2.tact | 0 .../stmts/return-analysis-try-catch.tact | 0 .../stmts/stmt-augmented-assgn-bool.tact | 0 .../stmts/stmt-augmented-assgn-numerical-type.tact | 0 .../stmts/stmt-destructuring.tact | 0 .../stmts/stmt-let-assgn-unbox.tact | 0 src/{types => 060-types}/stmts/stmt-let-assgn.tact | 0 .../stmts/stmt-let-if-elseif.tact | 0 .../stmts/stmt-let-map-type-inference.tact | 0 .../stmts/stmt-let-nullable-type-inference.tact | 0 .../stmts/var-scope-let-toString.tact | 0 .../stmts/var-scope-repeat.tact | 0 .../stmts/var-scope-repeat2.tact | 0 .../stmts/var-scope-toString-non-method.tact | 0 .../stmts/var-scope-valueOf-fun.tact | 0 .../stmts/var-underscore-name-in-foreach.tact | 0 .../stmts/var-underscore-name-in-foreach2.tact | 0 .../stmts/var-underscore-name-in-let.tact | 0 src/{types => 060-types}/subtyping.ts | 0 .../test-failed/asm-fun-shuffle-arg-duplicate.tact | 0 ...shuffle-arg-missing-and-non-existent-param.tact | 0 .../asm-fun-shuffle-arg-missing-param.tact | 0 .../asm-fun-shuffle-arg-non-existent-param.tact | 0 .../test-failed/asm-fun-shuffle-ret-duplicate.tact | 0 .../asm-fun-shuffle-ret-missing-position.tact | 0 .../asm-fun-shuffle-ret-non-existent-position.tact | 0 ...-default-field-wrong-initializer-type copy.tact | 0 .../test-failed/const-eval-overflow.tact | 0 .../test-failed/contract-bounced-receiver-int.tact | 0 .../contract-bounced-receiver-missing-type-1.tact | 0 .../contract-bounced-receiver-missing-type-2.tact | 0 .../test-failed/contract-bounced-storage-var.tact | 0 ...-decl-default-field-wrong-initializer-type.tact | 0 ...contract-const-override-virtual-no-keyword.tact | 0 .../contract-does-not-override-abstract-const.tact | 0 ...contract-does-not-override-abstract-getter.tact | 0 .../contract-duplicate-bounced-fallback.tact | 0 .../test-failed/contract-duplicate-bounced1.tact | 0 .../test-failed/contract-duplicate-bounced2.tact | 0 .../contract-duplicate-external-fallback.tact | 0 .../test-failed/contract-duplicate-external.tact | 0 .../test-failed/contract-duplicate-init.tact | 0 .../test-failed/contract-duplicate-receiver.tact | 0 .../contract-duplicate-storage-var.tact | 0 .../contract-duplicates-in-trait-list.tact | 0 ...ontract-getter-override-virtual-no-keyword.tact | 0 .../test-failed/contract-missing-type.tact | 0 .../test-failed/contract-receiver-int.tact | 0 .../contract-receiver-optional-msg.tact | 0 .../test-failed/contract-receiver-struct.tact | 0 .../expr-bitwise-not-bool-in-const1.tact | 0 .../expr-bitwise-not-bool-in-const2.tact | 0 .../test-failed/getter-outside-contract.tact | 0 .../test-failed/message-negative-opcode-1.tact | 0 .../test-failed/message-negative-opcode-2.tact | 0 .../test-failed/message-opcode-div-by-zero.tact | 0 .../test-failed/message-opcode-too-large-1.tact | 0 .../test-failed/message-opcode-too-large-2.tact | 0 .../test-failed/message-opcode-zero-1.tact | 0 .../test-failed/message-opcode-zero-2.tact | 0 .../test-failed/method-first-param-not-self1.tact | 0 .../test-failed/method-first-param-not-self2.tact | 0 .../test-failed/native-fun-getter.tact | 0 .../scope-contract-shadows-contract.tact | 0 .../test-failed/scope-duplicate-method.tact | 0 .../scope-fun-shadows-builtin-dumpStack.tact | 0 .../test-failed/scope-fun-shadows-builtin-ton.tact | 0 .../test-failed/scope-fun-shadows-fun.tact | 0 .../scope-internal-fun-shadows-internal-fun.tact | 0 .../test-failed/scope-param-shadows-param.tact | 0 .../scope-storage-var-shadows-trait-const.tact | 0 .../test-failed/scope-struct-shadows-contract.tact | 0 .../test-failed/scope-struct-shadows-struct.tact | 0 .../test-failed/struct-decl-clash-with-int.tact | 0 ...-decl-default-field-wrong-initializer-type.tact | 0 .../test-failed/struct-decl-duplicate-decl.tact | 0 .../test-failed/struct-decl-duplicate-field.tact | 0 .../test-failed/struct-decl-empty-not-allowed.tact | 0 .../struct-decl-mutually-recursive.tact | 0 .../struct-decl-remainder-in-the-middle.tact | 0 .../struct-decl-self-reference-map.tact | 0 .../test-failed/struct-decl-self-reference.tact | 0 .../trait-duplicates-in-trait-list.tact | 0 .../test-failed/trait-field-initialized.tact | 0 .../test-failed/wf-type-const.tact | 0 ...f-type-contract-const-incorrect-annotation.tact | 0 .../test-failed/wf-type-contract-const.tact | 0 .../test-failed/wf-type-contract-getter.tact | 0 ...ontract-incorrect-map-key-annotation-coins.tact | 0 ...ract-incorrect-map-key-annotation-varint16.tact | 0 ...ract-incorrect-map-key-annotation-varint32.tact | 0 ...act-incorrect-map-key-annotation-varuint16.tact | 0 ...act-incorrect-map-key-annotation-varuint32.tact | 0 .../test-failed/wf-type-fun-param.tact | 0 src/{types => 060-types}/test/asm-extends-fun.tact | 0 .../test/asm-fun-no-arg-shuffle.tact | 0 .../test/asm-fun-no-ret-shuffle.tact | 0 .../test/asm-fun-no-shuffle.tact | 0 .../test/asm-fun-shuffle-pair.tact | 0 .../test/const-decl-struct-with-default-field.tact | 0 .../const-decl-struct-with-optional-field.tact | 0 .../test/contract-bounced-slice.tact | 0 .../contract-bounced-too-small-not-detected.tact | 0 .../test/contract-const-override-abstract.tact | 0 .../test/contract-const-override-virtual.tact | 0 .../test/contract-external-fallback-receiver.tact | 0 .../test/contract-getter-override-abstract.tact | 0 .../test/contract-getter-override-virtual.tact | 0 .../test/fun-extends-opt-self.tact | 0 .../init-vars-analysis-uninit-storage-vars.tact | 0 .../test/item-funs-with-errors-in-bodies1.tact | 0 .../test/item-funs-with-errors-in-bodies2.tact | 0 src/{types => 060-types}/test/item-method.tact | 0 .../test/item-native-decl.tact | 0 .../test/item-native-mutating-method.tact | 0 .../test/map-value-as-coins.tact | 0 .../test/map-value-as-varint.tact | 0 .../test/map-value-as-varuint.tact | 0 .../test/message-opcode-expr.tact | 0 src/{types => 060-types}/test/scope-loops.tact | 0 .../test/struct-decl-default-field.tact | 0 .../test/struct-decl-nested.tact | 0 .../test/struct-decl-non-rec-types.tact | 0 .../test/struct-decl-remainder.tact | 0 src/{types => 060-types}/test/trait-base.tact | 0 src/{types => 060-types}/test/trait-foreach.tact | 0 src/{types => 060-types}/types.ts | 0 src/abi/AbiFunction.ts | 2 +- src/abi/global.ts | 2 +- src/abi/map.ts | 4 ++-- src/abi/struct.ts | 2 +- src/bindings/typescript/writeStruct.ts | 2 +- src/bindings/writeTypescript.ts | 4 ++-- src/generator/createABI.ts | 8 ++++---- src/generator/writeProgram.ts | 4 ++-- src/generator/writeReport.ts | 4 ++-- src/generator/writers/cast.ts | 4 ++-- src/generator/writers/resolveFuncFlatPack.ts | 4 ++-- src/generator/writers/resolveFuncFlatTypes.ts | 4 ++-- src/generator/writers/resolveFuncPrimitive.ts | 4 ++-- src/generator/writers/resolveFuncTupleType.ts | 4 ++-- src/generator/writers/resolveFuncType.spec.ts | 2 +- src/generator/writers/resolveFuncType.ts | 4 ++-- src/generator/writers/resolveFuncTypeFromAbi.ts | 2 +- .../writers/resolveFuncTypeFromAbiUnpack.ts | 2 +- src/generator/writers/resolveFuncTypeUnpack.ts | 4 ++-- src/generator/writers/writeAccessors.ts | 4 ++-- src/generator/writers/writeContract.ts | 2 +- src/generator/writers/writeExpression.spec.ts | 4 ++-- src/generator/writers/writeExpression.ts | 8 ++++---- src/generator/writers/writeFunction.ts | 6 +++--- src/generator/writers/writeInterfaces.ts | 4 ++-- src/generator/writers/writeRouter.ts | 4 ++-- src/generator/writers/writeSerialization.spec.ts | 4 ++-- src/generator/writers/writeSerialization.ts | 6 +++--- src/interpreter/constEval.ts | 2 +- src/interpreter/interpreter.ts | 6 +++--- src/optimizer/associative.ts | 2 +- src/optimizer/util.ts | 2 +- 387 files changed, 80 insertions(+), 80 deletions(-) rename src/{storage => 060-types}/StorageAllocation.ts (100%) rename src/{storage => 060-types}/__snapshots__/resolveAllocation.spec.ts.snap (100%) rename src/{types => 060-types}/__snapshots__/resolveDescriptors.spec.ts.snap (100%) rename src/{types => 060-types}/__snapshots__/resolveStatements.spec.ts.snap (100%) rename src/{storage => 060-types}/allocator.ts (100%) rename src/{types => 060-types}/getSupportedInterfaces.ts (100%) rename src/{types => 060-types}/isRuntimeType.ts (100%) rename src/{storage => 060-types}/operation.ts (100%) rename src/{types => 060-types}/resolveABITypeRef.ts (100%) rename src/{storage => 060-types}/resolveAllocation.spec.ts (89%) rename src/{storage => 060-types}/resolveAllocation.ts (96%) rename src/{types => 060-types}/resolveDescriptors.spec.ts (100%) rename src/{types => 060-types}/resolveDescriptors.ts (100%) rename src/{types => 060-types}/resolveErrors.ts (100%) rename src/{types => 060-types}/resolveExpression.ts (100%) rename src/{types => 060-types}/resolveSignatures.ts (100%) rename src/{types => 060-types}/resolveStatements.spec.ts (100%) rename src/{types => 060-types}/resolveStatements.ts (100%) rename src/{types => 060-types}/stmts-failed/assign-augmented-const-contract.tact (100%) rename src/{types => 060-types}/stmts-failed/assign-augmented-const-global.tact (100%) rename src/{types => 060-types}/stmts-failed/assign-augmented-const-struct-contract.tact (100%) rename src/{types => 060-types}/stmts-failed/assign-augmented-const-struct-global.tact (100%) rename src/{types => 060-types}/stmts-failed/assign-const-contract.tact (100%) rename src/{types => 060-types}/stmts-failed/assign-const-global.tact (100%) rename src/{types => 060-types}/stmts-failed/assign-const-struct-contract.tact (100%) rename src/{types => 060-types}/stmts-failed/assign-const-struct-global.tact (100%) rename src/{types => 060-types}/stmts-failed/bounced-type-is-smaller.tact (100%) rename src/{types => 060-types}/stmts-failed/contract-getter-with-method-id-1.tact (100%) rename src/{types => 060-types}/stmts-failed/contract-getter-with-method-id-2.tact (100%) rename src/{types => 060-types}/stmts-failed/contract-initof-wrong-arg.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-bitwise-not-bool.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-conditional-branch-mismatch-nested1.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-conditional-branch-mismatch-nested2.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-conditional-branch-mismatch.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-conditional-non-optional-result-expected1.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-conditional-non-optional-result-expected2.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-conditional-non-optional-result-expected3.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-conditional-result-mismatch.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-conditional-void-branches copy.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-bounced.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-builder.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-contract.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-int-bool.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-map-map.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-null-1.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-null-2.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-null-3.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-null-bounced.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-optional-builder.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-optional-stringbuilder.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-optional-struct-null.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-optional-struct.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-stringbuilder.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-struct.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-void-null.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-void1.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-eq-void2.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-field-does-not-exist-but-method-does.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-field-does-not-exist.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-internal-fun-call-bool-param.tact.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-map-del-method-is-non-void.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-map-exists-method-not-bool.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-map-exists-method-on-not-map.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-method-does-not-exist-but-field-does.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-module-fun-call-bool-param.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-struct-duplicate-field.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-struct-impossible-field-punning.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-struct-missing-field.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-struct-wrong-field-type.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-var-int-bool.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-wrong-arity-internal-fun.tact (100%) rename src/{types => 060-types}/stmts-failed/expr-wrong-arity-module-fun.tact (100%) rename src/{types => 060-types}/stmts-failed/getter-collision-trait.tact (100%) rename src/{types => 060-types}/stmts-failed/getter-collision-with-reserved1.tact (100%) rename src/{types => 060-types}/stmts-failed/getter-collision-with-reserved2.tact (100%) rename src/{types => 060-types}/stmts-failed/getter-collision-with-reserved3.tact (100%) rename src/{types => 060-types}/stmts-failed/getter-collision-with-reserved_opt1.tact (100%) rename src/{types => 060-types}/stmts-failed/getter-collision-with-reserved_opt2.tact (100%) rename src/{types => 060-types}/stmts-failed/getter-collision-with-reserved_opt3.tact (100%) rename src/{types => 060-types}/stmts-failed/getter-collision-with-trait.tact (100%) rename src/{types => 060-types}/stmts-failed/getter-collision.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-if.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-implicit-init.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-missing-storage-var.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-used-uninit-storage-augmented-assign1.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-used-uninit-storage-augmented-assign2.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-used-uninit-storage-override-fun-call.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-used-uninit-storage-struct1.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-used-uninit-storage-struct2.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-used-uninit-storage-var-fun-call.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-used-uninit-storage-var.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-with-if-else.tact (100%) rename src/{types => 060-types}/stmts-failed/init-vars-analysis-with-if-elseif.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-catch-if.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-do-if.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-if.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-non-void1.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-non-void2.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-repeat.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-separate-ifs.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-throw-wrapped.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-try1.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-try2.tact (100%) rename src/{types => 060-types}/stmts-failed/return-analysis-while.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-assgn-int-string.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-augmented-assgn-bool-int.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-augmented-assgn-bool.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-augmented-assgn-int-bool.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-augmented-assgn-int.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-augmented-assgn-not-matching.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-augmented-assgn-string.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-conditional-expr-stmt-void1.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-duplicate-id.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-non-destructable-opt.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-non-destructable.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-non-destructable2.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-non-existing-punned.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-non-existing-punned2.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-non-existing-underscore.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-non-existing.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-shadowed-const-id.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-shadowed-id.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-wrong-count.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-wrong-count2.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-destructuring-fields-wrong-type.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-do-int.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-foreach-non-map.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-foreach-non-path-map.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-if-int.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-let-unknown-type-inference.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-let-unknown-type-inference2.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-let-void-inference.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-let-wrong-rhs.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-repeat-bool.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-return-from-try-and-catch.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-return-void1.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-return-void2.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-return-void3.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-unboxing-expr-stmt-void.tact (100%) rename src/{types => 060-types}/stmts-failed/stmt-while-int.tact (100%) rename src/{types => 060-types}/stmts-failed/usage-of-bounced-field-in-type-that-is-too-big-2.tact (100%) rename src/{types => 060-types}/stmts-failed/usage-of-bounced-field-in-type-that-is-too-big.tact (100%) rename src/{types => 060-types}/stmts-failed/usage-of-bounced-field-that-is-too-big.tact (100%) rename src/{types => 060-types}/stmts-failed/var-does-not-exist.tact (100%) rename src/{types => 060-types}/stmts-failed/var-does-not-exist2.tact (100%) rename src/{types => 060-types}/stmts-failed/var-does-not-exist3.tact (100%) rename src/{types => 060-types}/stmts-failed/var-does-not-exist4.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-catch-does-not-shadow-outer-const.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-catch-does-not-shadow-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-catch-param-does-not-shadow-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-catch-param-is-not-visible-in-try.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-const-shadowing-catch.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-const-shadowing-external-param.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-const-shadowing-foreach.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-const-shadowing-fun-param.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-const-shadowing-let.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-const-shadowing-receiver-param.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-do-until-shadows-outer-const.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-do-until-shadows-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-external-shadows-param.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-internal-var-does-not-escape.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-key-does-not-escape.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-key-shadows-map.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-key-shadows-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-shadows-outer-const.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-shadows-outer-map.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-shadows-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-val-does-not-escape.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-val-shadows-const-map.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-val-shadows-key.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-val-shadows-map.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-foreach-val-shadows-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-function-shadows-local-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-function-shadows-param.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-if-else-shadows-outer-const.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-if-else-shadows-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-if-then-shadows-outer-const.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-if-then-shadows-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-local-catch-param-does-not-escape.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-local-loop-var-does-not-escape.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-missing-storage-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-no-toString-global-fun1.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-no-toString-global-fun2.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-no-valueOf-global-fun.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-rec-fun-shadowing-catch.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-rec-fun-shadowing-foreach.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-rec-fun-shadowing-fun-param.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-rec-fun-shadowing-let.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-receiver-shadows-param.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-repeat-shadows-outer-const.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-repeat-shadows-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-try-does-not-shadow-outer-const.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-try-does-not-shadow-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-while-shadows-outer-const.tact (100%) rename src/{types => 060-types}/stmts-failed/var-scope-while-shadows-outer-var.tact (100%) rename src/{types => 060-types}/stmts-failed/var-underscore-name-access.tact (100%) rename src/{types => 060-types}/stmts-failed/var-underscore-name-access2.tact (100%) rename src/{types => 060-types}/stmts-failed/var-underscore-name-access3.tact (100%) rename src/{types => 060-types}/stmts-failed/wf-type-let.tact (100%) rename src/{types => 060-types}/stmts/assign-self-mutating-method.tact (100%) rename src/{types => 060-types}/stmts/contract-getter-with-method-id-1.tact (100%) rename src/{types => 060-types}/stmts/contract-getter-with-method-id-2.tact (100%) rename src/{types => 060-types}/stmts/contract-getter-with-method-id-3.tact (100%) rename src/{types => 060-types}/stmts/contract-receiver-bounced.tact (100%) rename src/{types => 060-types}/stmts/expr-arith-bool-cmp.tact (100%) rename src/{types => 060-types}/stmts/expr-conditional-with-subtyping.tact (100%) rename src/{types => 060-types}/stmts/expr-eq-arith.tact (100%) rename src/{types => 060-types}/stmts/expr-eq-int-optional-int.tact (100%) rename src/{types => 060-types}/stmts/expr-eq-literal.tact (100%) rename src/{types => 060-types}/stmts/expr-eq-map-map.tact (100%) rename src/{types => 060-types}/stmts/expr-eq-map-null.tact (100%) rename src/{types => 060-types}/stmts/expr-eq-null-null.tact (100%) rename src/{types => 060-types}/stmts/expr-eq-optional-int-null.tact (100%) rename src/{types => 060-types}/stmts/expr-eq-optional-struct-null.tact (100%) rename src/{types => 060-types}/stmts/expr-field-access-method-call.tact (100%) rename src/{types => 060-types}/stmts/expr-maps-del-method.tact (100%) rename src/{types => 060-types}/stmts/expr-maps-exists-method.tact (100%) rename src/{types => 060-types}/stmts/expr-struct-construction.tact (100%) rename src/{types => 060-types}/stmts/fun-extends-optional.tact (100%) rename src/{types => 060-types}/stmts/init-vars-analysis-with-if.tact (100%) rename src/{types => 060-types}/stmts/return-analysis-if-elseif.tact (100%) rename src/{types => 060-types}/stmts/return-analysis-if-try-catch-do-loop.tact (100%) rename src/{types => 060-types}/stmts/return-analysis-no-return-in-void1.tact (100%) rename src/{types => 060-types}/stmts/return-analysis-no-return-in-void2.tact (100%) rename src/{types => 060-types}/stmts/return-analysis-throw1.tact (100%) rename src/{types => 060-types}/stmts/return-analysis-throw2.tact (100%) rename src/{types => 060-types}/stmts/return-analysis-try-catch.tact (100%) rename src/{types => 060-types}/stmts/stmt-augmented-assgn-bool.tact (100%) rename src/{types => 060-types}/stmts/stmt-augmented-assgn-numerical-type.tact (100%) rename src/{types => 060-types}/stmts/stmt-destructuring.tact (100%) rename src/{types => 060-types}/stmts/stmt-let-assgn-unbox.tact (100%) rename src/{types => 060-types}/stmts/stmt-let-assgn.tact (100%) rename src/{types => 060-types}/stmts/stmt-let-if-elseif.tact (100%) rename src/{types => 060-types}/stmts/stmt-let-map-type-inference.tact (100%) rename src/{types => 060-types}/stmts/stmt-let-nullable-type-inference.tact (100%) rename src/{types => 060-types}/stmts/var-scope-let-toString.tact (100%) rename src/{types => 060-types}/stmts/var-scope-repeat.tact (100%) rename src/{types => 060-types}/stmts/var-scope-repeat2.tact (100%) rename src/{types => 060-types}/stmts/var-scope-toString-non-method.tact (100%) rename src/{types => 060-types}/stmts/var-scope-valueOf-fun.tact (100%) rename src/{types => 060-types}/stmts/var-underscore-name-in-foreach.tact (100%) rename src/{types => 060-types}/stmts/var-underscore-name-in-foreach2.tact (100%) rename src/{types => 060-types}/stmts/var-underscore-name-in-let.tact (100%) rename src/{types => 060-types}/subtyping.ts (100%) rename src/{types => 060-types}/test-failed/asm-fun-shuffle-arg-duplicate.tact (100%) rename src/{types => 060-types}/test-failed/asm-fun-shuffle-arg-missing-and-non-existent-param.tact (100%) rename src/{types => 060-types}/test-failed/asm-fun-shuffle-arg-missing-param.tact (100%) rename src/{types => 060-types}/test-failed/asm-fun-shuffle-arg-non-existent-param.tact (100%) rename src/{types => 060-types}/test-failed/asm-fun-shuffle-ret-duplicate.tact (100%) rename src/{types => 060-types}/test-failed/asm-fun-shuffle-ret-missing-position.tact (100%) rename src/{types => 060-types}/test-failed/asm-fun-shuffle-ret-non-existent-position.tact (100%) rename src/{types => 060-types}/test-failed/const-decl-default-field-wrong-initializer-type copy.tact (100%) rename src/{types => 060-types}/test-failed/const-eval-overflow.tact (100%) rename src/{types => 060-types}/test-failed/contract-bounced-receiver-int.tact (100%) rename src/{types => 060-types}/test-failed/contract-bounced-receiver-missing-type-1.tact (100%) rename src/{types => 060-types}/test-failed/contract-bounced-receiver-missing-type-2.tact (100%) rename src/{types => 060-types}/test-failed/contract-bounced-storage-var.tact (100%) rename src/{types => 060-types}/test-failed/contract-const-decl-default-field-wrong-initializer-type.tact (100%) rename src/{types => 060-types}/test-failed/contract-const-override-virtual-no-keyword.tact (100%) rename src/{types => 060-types}/test-failed/contract-does-not-override-abstract-const.tact (100%) rename src/{types => 060-types}/test-failed/contract-does-not-override-abstract-getter.tact (100%) rename src/{types => 060-types}/test-failed/contract-duplicate-bounced-fallback.tact (100%) rename src/{types => 060-types}/test-failed/contract-duplicate-bounced1.tact (100%) rename src/{types => 060-types}/test-failed/contract-duplicate-bounced2.tact (100%) rename src/{types => 060-types}/test-failed/contract-duplicate-external-fallback.tact (100%) rename src/{types => 060-types}/test-failed/contract-duplicate-external.tact (100%) rename src/{types => 060-types}/test-failed/contract-duplicate-init.tact (100%) rename src/{types => 060-types}/test-failed/contract-duplicate-receiver.tact (100%) rename src/{types => 060-types}/test-failed/contract-duplicate-storage-var.tact (100%) rename src/{types => 060-types}/test-failed/contract-duplicates-in-trait-list.tact (100%) rename src/{types => 060-types}/test-failed/contract-getter-override-virtual-no-keyword.tact (100%) rename src/{types => 060-types}/test-failed/contract-missing-type.tact (100%) rename src/{types => 060-types}/test-failed/contract-receiver-int.tact (100%) rename src/{types => 060-types}/test-failed/contract-receiver-optional-msg.tact (100%) rename src/{types => 060-types}/test-failed/contract-receiver-struct.tact (100%) rename src/{types => 060-types}/test-failed/expr-bitwise-not-bool-in-const1.tact (100%) rename src/{types => 060-types}/test-failed/expr-bitwise-not-bool-in-const2.tact (100%) rename src/{types => 060-types}/test-failed/getter-outside-contract.tact (100%) rename src/{types => 060-types}/test-failed/message-negative-opcode-1.tact (100%) rename src/{types => 060-types}/test-failed/message-negative-opcode-2.tact (100%) rename src/{types => 060-types}/test-failed/message-opcode-div-by-zero.tact (100%) rename src/{types => 060-types}/test-failed/message-opcode-too-large-1.tact (100%) rename src/{types => 060-types}/test-failed/message-opcode-too-large-2.tact (100%) rename src/{types => 060-types}/test-failed/message-opcode-zero-1.tact (100%) rename src/{types => 060-types}/test-failed/message-opcode-zero-2.tact (100%) rename src/{types => 060-types}/test-failed/method-first-param-not-self1.tact (100%) rename src/{types => 060-types}/test-failed/method-first-param-not-self2.tact (100%) rename src/{types => 060-types}/test-failed/native-fun-getter.tact (100%) rename src/{types => 060-types}/test-failed/scope-contract-shadows-contract.tact (100%) rename src/{types => 060-types}/test-failed/scope-duplicate-method.tact (100%) rename src/{types => 060-types}/test-failed/scope-fun-shadows-builtin-dumpStack.tact (100%) rename src/{types => 060-types}/test-failed/scope-fun-shadows-builtin-ton.tact (100%) rename src/{types => 060-types}/test-failed/scope-fun-shadows-fun.tact (100%) rename src/{types => 060-types}/test-failed/scope-internal-fun-shadows-internal-fun.tact (100%) rename src/{types => 060-types}/test-failed/scope-param-shadows-param.tact (100%) rename src/{types => 060-types}/test-failed/scope-storage-var-shadows-trait-const.tact (100%) rename src/{types => 060-types}/test-failed/scope-struct-shadows-contract.tact (100%) rename src/{types => 060-types}/test-failed/scope-struct-shadows-struct.tact (100%) rename src/{types => 060-types}/test-failed/struct-decl-clash-with-int.tact (100%) rename src/{types => 060-types}/test-failed/struct-decl-default-field-wrong-initializer-type.tact (100%) rename src/{types => 060-types}/test-failed/struct-decl-duplicate-decl.tact (100%) rename src/{types => 060-types}/test-failed/struct-decl-duplicate-field.tact (100%) rename src/{types => 060-types}/test-failed/struct-decl-empty-not-allowed.tact (100%) rename src/{types => 060-types}/test-failed/struct-decl-mutually-recursive.tact (100%) rename src/{types => 060-types}/test-failed/struct-decl-remainder-in-the-middle.tact (100%) rename src/{types => 060-types}/test-failed/struct-decl-self-reference-map.tact (100%) rename src/{types => 060-types}/test-failed/struct-decl-self-reference.tact (100%) rename src/{types => 060-types}/test-failed/trait-duplicates-in-trait-list.tact (100%) rename src/{types => 060-types}/test-failed/trait-field-initialized.tact (100%) rename src/{types => 060-types}/test-failed/wf-type-const.tact (100%) rename src/{types => 060-types}/test-failed/wf-type-contract-const-incorrect-annotation.tact (100%) rename src/{types => 060-types}/test-failed/wf-type-contract-const.tact (100%) rename src/{types => 060-types}/test-failed/wf-type-contract-getter.tact (100%) rename src/{types => 060-types}/test-failed/wf-type-contract-incorrect-map-key-annotation-coins.tact (100%) rename src/{types => 060-types}/test-failed/wf-type-contract-incorrect-map-key-annotation-varint16.tact (100%) rename src/{types => 060-types}/test-failed/wf-type-contract-incorrect-map-key-annotation-varint32.tact (100%) rename src/{types => 060-types}/test-failed/wf-type-contract-incorrect-map-key-annotation-varuint16.tact (100%) rename src/{types => 060-types}/test-failed/wf-type-contract-incorrect-map-key-annotation-varuint32.tact (100%) rename src/{types => 060-types}/test-failed/wf-type-fun-param.tact (100%) rename src/{types => 060-types}/test/asm-extends-fun.tact (100%) rename src/{types => 060-types}/test/asm-fun-no-arg-shuffle.tact (100%) rename src/{types => 060-types}/test/asm-fun-no-ret-shuffle.tact (100%) rename src/{types => 060-types}/test/asm-fun-no-shuffle.tact (100%) rename src/{types => 060-types}/test/asm-fun-shuffle-pair.tact (100%) rename src/{types => 060-types}/test/const-decl-struct-with-default-field.tact (100%) rename src/{types => 060-types}/test/const-decl-struct-with-optional-field.tact (100%) rename src/{types => 060-types}/test/contract-bounced-slice.tact (100%) rename src/{types => 060-types}/test/contract-bounced-too-small-not-detected.tact (100%) rename src/{types => 060-types}/test/contract-const-override-abstract.tact (100%) rename src/{types => 060-types}/test/contract-const-override-virtual.tact (100%) rename src/{types => 060-types}/test/contract-external-fallback-receiver.tact (100%) rename src/{types => 060-types}/test/contract-getter-override-abstract.tact (100%) rename src/{types => 060-types}/test/contract-getter-override-virtual.tact (100%) rename src/{types => 060-types}/test/fun-extends-opt-self.tact (100%) rename src/{types => 060-types}/test/init-vars-analysis-uninit-storage-vars.tact (100%) rename src/{types => 060-types}/test/item-funs-with-errors-in-bodies1.tact (100%) rename src/{types => 060-types}/test/item-funs-with-errors-in-bodies2.tact (100%) rename src/{types => 060-types}/test/item-method.tact (100%) rename src/{types => 060-types}/test/item-native-decl.tact (100%) rename src/{types => 060-types}/test/item-native-mutating-method.tact (100%) rename src/{types => 060-types}/test/map-value-as-coins.tact (100%) rename src/{types => 060-types}/test/map-value-as-varint.tact (100%) rename src/{types => 060-types}/test/map-value-as-varuint.tact (100%) rename src/{types => 060-types}/test/message-opcode-expr.tact (100%) rename src/{types => 060-types}/test/scope-loops.tact (100%) rename src/{types => 060-types}/test/struct-decl-default-field.tact (100%) rename src/{types => 060-types}/test/struct-decl-nested.tact (100%) rename src/{types => 060-types}/test/struct-decl-non-rec-types.tact (100%) rename src/{types => 060-types}/test/struct-decl-remainder.tact (100%) rename src/{types => 060-types}/test/trait-base.tact (100%) rename src/{types => 060-types}/test/trait-foreach.tact (100%) rename src/{types => 060-types}/types.ts (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1b348b7b8..c34d5a2a1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -127,18 +127,18 @@ The [src/grammar/test](src/050-grammar/test) folder contains Tact files that are The Tact type-checker's implementation can be found mostly in the following files: -- [src/types/resolveDescriptors.ts](./src/types/resolveDescriptors.ts) takes care of checking at the level of module-items, data type definitions, function signatures, etc. and it does not deal with statements (so does not traverse function bodies); -- [src/types/resolveStatements.ts](./src/types/resolveStatements.ts) checks statements and statements blocks; -- [src/types/resolveExpression.ts](./src/types/resolveExpression.ts) type-checks the Tact expressions. +- [src/types/resolveDescriptors.ts](src/060-types/resolveDescriptors.ts) takes care of checking at the level of module-items, data type definitions, function signatures, etc. and it does not deal with statements (so does not traverse function bodies); +- [src/types/resolveStatements.ts](src/060-types/resolveStatements.ts) checks statements and statements blocks; +- [src/types/resolveExpression.ts](src/060-types/resolveExpression.ts) type-checks the Tact expressions. The current implementation of the typechecker is going to be significantly refactored, as per [issue #458](https://github.com/tact-lang/tact/issues/458). The corresponding pull request will have formally specified the Tact typing rules. Until we have the Tact type system specified, the only source of information about it would be the aforementioned Tact docs and the tests in the following locations: -- [src/types/test](./src/types/test): positive well-formedness tests at the level of data types, contracts, traits and function signatures; -- [src/types/test-failed](./src/types/test-failed): negative well-formedness tests at the level of data types, contracts, traits and function signatures; -- [src/types/stmts](./src/types/stmts): positive type-checking tests at the level of function bodies; -- [src/types/stmts-failed](./src/types/stmts-failed): negative type-checking tests at the level of function bodies; +- [src/types/test](src/060-types/test): positive well-formedness tests at the level of data types, contracts, traits and function signatures; +- [src/types/test-failed](src/060-types/test-failed): negative well-formedness tests at the level of data types, contracts, traits and function signatures; +- [src/types/stmts](src/060-types/stmts): positive type-checking tests at the level of function bodies; +- [src/types/stmts-failed](src/060-types/stmts-failed): negative type-checking tests at the level of function bodies; - [src/test/compilation-failed](./src/test/compilation-failed): negative type-checking tests that require full environment, for instance, the standard library (the other tests in `src/types` don't have access to the full environment). ### Constant evaluator diff --git a/src/010-pipeline/build.ts b/src/010-pipeline/build.ts index 3f0c644f9..b9a65bcd6 100644 --- a/src/010-pipeline/build.ts +++ b/src/010-pipeline/build.ts @@ -11,8 +11,8 @@ import files from "../040-imports/stdlib"; import { ILogger, Logger } from "./logger"; import { PackageFileFormat } from "../packaging/fileFormat"; import { packageCode } from "../packaging/packageCode"; -import { createABITypeRefFromTypeRef } from "../types/resolveABITypeRef"; -import { getContracts, getType } from "../types/resolveDescriptors"; +import { createABITypeRefFromTypeRef } from "../060-types/resolveABITypeRef"; +import { getContracts, getType } from "../060-types/resolveDescriptors"; import { posixNormalize } from "../utils/filePath"; import { createVirtualFileSystem } from "../020-vfs/createVirtualFileSystem"; import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; diff --git a/src/010-pipeline/precompile.ts b/src/010-pipeline/precompile.ts index 8a839b81e..74c619830 100644 --- a/src/010-pipeline/precompile.ts +++ b/src/010-pipeline/precompile.ts @@ -1,10 +1,10 @@ import { CompilerContext } from "./context"; -import { resolveDescriptors } from "../types/resolveDescriptors"; -import { resolveAllocations } from "../storage/resolveAllocation"; +import { resolveDescriptors } from "../060-types/resolveDescriptors"; +import { resolveAllocations } from "../060-types/resolveAllocation"; import { openContext } from "../050-grammar/store"; -import { resolveStatements } from "../types/resolveStatements"; -import { resolveErrors } from "../types/resolveErrors"; -import { resolveSignatures } from "../types/resolveSignatures"; +import { resolveStatements } from "../060-types/resolveStatements"; +import { resolveErrors } from "../060-types/resolveErrors"; +import { resolveSignatures } from "../060-types/resolveSignatures"; import { resolveImports } from "../040-imports/resolveImports"; import { VirtualFileSystem } from "../020-vfs/VirtualFileSystem"; import { AstModule, FactoryAst } from "../050-grammar/ast"; diff --git a/src/storage/StorageAllocation.ts b/src/060-types/StorageAllocation.ts similarity index 100% rename from src/storage/StorageAllocation.ts rename to src/060-types/StorageAllocation.ts diff --git a/src/storage/__snapshots__/resolveAllocation.spec.ts.snap b/src/060-types/__snapshots__/resolveAllocation.spec.ts.snap similarity index 100% rename from src/storage/__snapshots__/resolveAllocation.spec.ts.snap rename to src/060-types/__snapshots__/resolveAllocation.spec.ts.snap diff --git a/src/types/__snapshots__/resolveDescriptors.spec.ts.snap b/src/060-types/__snapshots__/resolveDescriptors.spec.ts.snap similarity index 100% rename from src/types/__snapshots__/resolveDescriptors.spec.ts.snap rename to src/060-types/__snapshots__/resolveDescriptors.spec.ts.snap diff --git a/src/types/__snapshots__/resolveStatements.spec.ts.snap b/src/060-types/__snapshots__/resolveStatements.spec.ts.snap similarity index 100% rename from src/types/__snapshots__/resolveStatements.spec.ts.snap rename to src/060-types/__snapshots__/resolveStatements.spec.ts.snap diff --git a/src/storage/allocator.ts b/src/060-types/allocator.ts similarity index 100% rename from src/storage/allocator.ts rename to src/060-types/allocator.ts diff --git a/src/types/getSupportedInterfaces.ts b/src/060-types/getSupportedInterfaces.ts similarity index 100% rename from src/types/getSupportedInterfaces.ts rename to src/060-types/getSupportedInterfaces.ts diff --git a/src/types/isRuntimeType.ts b/src/060-types/isRuntimeType.ts similarity index 100% rename from src/types/isRuntimeType.ts rename to src/060-types/isRuntimeType.ts diff --git a/src/storage/operation.ts b/src/060-types/operation.ts similarity index 100% rename from src/storage/operation.ts rename to src/060-types/operation.ts diff --git a/src/types/resolveABITypeRef.ts b/src/060-types/resolveABITypeRef.ts similarity index 100% rename from src/types/resolveABITypeRef.ts rename to src/060-types/resolveABITypeRef.ts diff --git a/src/storage/resolveAllocation.spec.ts b/src/060-types/resolveAllocation.spec.ts similarity index 89% rename from src/storage/resolveAllocation.spec.ts rename to src/060-types/resolveAllocation.spec.ts index e55bc9638..f41a0689c 100644 --- a/src/storage/resolveAllocation.spec.ts +++ b/src/060-types/resolveAllocation.spec.ts @@ -1,10 +1,10 @@ import fs from "fs"; -import { resolveDescriptors } from "../types/resolveDescriptors"; +import { resolveDescriptors } from "./resolveDescriptors"; import { getAllocations, resolveAllocations } from "./resolveAllocation"; import { openContext } from "../050-grammar/store"; -import { resolveStatements } from "../types/resolveStatements"; +import { resolveStatements } from "./resolveStatements"; import { CompilerContext } from "../010-pipeline/context"; -import { resolveSignatures } from "../types/resolveSignatures"; +import { resolveSignatures } from "./resolveSignatures"; import path from "path"; import { getParser } from "../050-grammar"; import { getAstFactory } from "../050-grammar/ast"; diff --git a/src/storage/resolveAllocation.ts b/src/060-types/resolveAllocation.ts similarity index 96% rename from src/storage/resolveAllocation.ts rename to src/060-types/resolveAllocation.ts index 5bcc01fce..187d6e385 100644 --- a/src/storage/resolveAllocation.ts +++ b/src/060-types/resolveAllocation.ts @@ -1,11 +1,11 @@ import { CompilerContext, createContextStore } from "../010-pipeline/context"; -import { getType, toBounced, getAllTypes } from "../types/resolveDescriptors"; -import { TypeDescription } from "../types/types"; +import { getType, toBounced, getAllTypes } from "./resolveDescriptors"; +import { TypeDescription } from "./types"; import { topologicalSort } from "../utils/utils"; import { StorageAllocation } from "./StorageAllocation"; import { AllocationOperation } from "./operation"; import { allocate, getAllocationOperationFromField } from "./allocator"; -import { createABITypeRefFromTypeRef } from "../types/resolveABITypeRef"; +import { createABITypeRefFromTypeRef } from "./resolveABITypeRef"; import { funcInitIdOf } from "../generator/writers/id"; import { throwInternalCompilerError } from "../030-error/errors"; import { idText } from "../050-grammar/ast"; diff --git a/src/types/resolveDescriptors.spec.ts b/src/060-types/resolveDescriptors.spec.ts similarity index 100% rename from src/types/resolveDescriptors.spec.ts rename to src/060-types/resolveDescriptors.spec.ts diff --git a/src/types/resolveDescriptors.ts b/src/060-types/resolveDescriptors.ts similarity index 100% rename from src/types/resolveDescriptors.ts rename to src/060-types/resolveDescriptors.ts diff --git a/src/types/resolveErrors.ts b/src/060-types/resolveErrors.ts similarity index 100% rename from src/types/resolveErrors.ts rename to src/060-types/resolveErrors.ts diff --git a/src/types/resolveExpression.ts b/src/060-types/resolveExpression.ts similarity index 100% rename from src/types/resolveExpression.ts rename to src/060-types/resolveExpression.ts diff --git a/src/types/resolveSignatures.ts b/src/060-types/resolveSignatures.ts similarity index 100% rename from src/types/resolveSignatures.ts rename to src/060-types/resolveSignatures.ts diff --git a/src/types/resolveStatements.spec.ts b/src/060-types/resolveStatements.spec.ts similarity index 100% rename from src/types/resolveStatements.spec.ts rename to src/060-types/resolveStatements.spec.ts diff --git a/src/types/resolveStatements.ts b/src/060-types/resolveStatements.ts similarity index 100% rename from src/types/resolveStatements.ts rename to src/060-types/resolveStatements.ts diff --git a/src/types/stmts-failed/assign-augmented-const-contract.tact b/src/060-types/stmts-failed/assign-augmented-const-contract.tact similarity index 100% rename from src/types/stmts-failed/assign-augmented-const-contract.tact rename to src/060-types/stmts-failed/assign-augmented-const-contract.tact diff --git a/src/types/stmts-failed/assign-augmented-const-global.tact b/src/060-types/stmts-failed/assign-augmented-const-global.tact similarity index 100% rename from src/types/stmts-failed/assign-augmented-const-global.tact rename to src/060-types/stmts-failed/assign-augmented-const-global.tact diff --git a/src/types/stmts-failed/assign-augmented-const-struct-contract.tact b/src/060-types/stmts-failed/assign-augmented-const-struct-contract.tact similarity index 100% rename from src/types/stmts-failed/assign-augmented-const-struct-contract.tact rename to src/060-types/stmts-failed/assign-augmented-const-struct-contract.tact diff --git a/src/types/stmts-failed/assign-augmented-const-struct-global.tact b/src/060-types/stmts-failed/assign-augmented-const-struct-global.tact similarity index 100% rename from src/types/stmts-failed/assign-augmented-const-struct-global.tact rename to src/060-types/stmts-failed/assign-augmented-const-struct-global.tact diff --git a/src/types/stmts-failed/assign-const-contract.tact b/src/060-types/stmts-failed/assign-const-contract.tact similarity index 100% rename from src/types/stmts-failed/assign-const-contract.tact rename to src/060-types/stmts-failed/assign-const-contract.tact diff --git a/src/types/stmts-failed/assign-const-global.tact b/src/060-types/stmts-failed/assign-const-global.tact similarity index 100% rename from src/types/stmts-failed/assign-const-global.tact rename to src/060-types/stmts-failed/assign-const-global.tact diff --git a/src/types/stmts-failed/assign-const-struct-contract.tact b/src/060-types/stmts-failed/assign-const-struct-contract.tact similarity index 100% rename from src/types/stmts-failed/assign-const-struct-contract.tact rename to src/060-types/stmts-failed/assign-const-struct-contract.tact diff --git a/src/types/stmts-failed/assign-const-struct-global.tact b/src/060-types/stmts-failed/assign-const-struct-global.tact similarity index 100% rename from src/types/stmts-failed/assign-const-struct-global.tact rename to src/060-types/stmts-failed/assign-const-struct-global.tact diff --git a/src/types/stmts-failed/bounced-type-is-smaller.tact b/src/060-types/stmts-failed/bounced-type-is-smaller.tact similarity index 100% rename from src/types/stmts-failed/bounced-type-is-smaller.tact rename to src/060-types/stmts-failed/bounced-type-is-smaller.tact diff --git a/src/types/stmts-failed/contract-getter-with-method-id-1.tact b/src/060-types/stmts-failed/contract-getter-with-method-id-1.tact similarity index 100% rename from src/types/stmts-failed/contract-getter-with-method-id-1.tact rename to src/060-types/stmts-failed/contract-getter-with-method-id-1.tact diff --git a/src/types/stmts-failed/contract-getter-with-method-id-2.tact b/src/060-types/stmts-failed/contract-getter-with-method-id-2.tact similarity index 100% rename from src/types/stmts-failed/contract-getter-with-method-id-2.tact rename to src/060-types/stmts-failed/contract-getter-with-method-id-2.tact diff --git a/src/types/stmts-failed/contract-initof-wrong-arg.tact b/src/060-types/stmts-failed/contract-initof-wrong-arg.tact similarity index 100% rename from src/types/stmts-failed/contract-initof-wrong-arg.tact rename to src/060-types/stmts-failed/contract-initof-wrong-arg.tact diff --git a/src/types/stmts-failed/expr-bitwise-not-bool.tact b/src/060-types/stmts-failed/expr-bitwise-not-bool.tact similarity index 100% rename from src/types/stmts-failed/expr-bitwise-not-bool.tact rename to src/060-types/stmts-failed/expr-bitwise-not-bool.tact diff --git a/src/types/stmts-failed/expr-conditional-branch-mismatch-nested1.tact b/src/060-types/stmts-failed/expr-conditional-branch-mismatch-nested1.tact similarity index 100% rename from src/types/stmts-failed/expr-conditional-branch-mismatch-nested1.tact rename to src/060-types/stmts-failed/expr-conditional-branch-mismatch-nested1.tact diff --git a/src/types/stmts-failed/expr-conditional-branch-mismatch-nested2.tact b/src/060-types/stmts-failed/expr-conditional-branch-mismatch-nested2.tact similarity index 100% rename from src/types/stmts-failed/expr-conditional-branch-mismatch-nested2.tact rename to src/060-types/stmts-failed/expr-conditional-branch-mismatch-nested2.tact diff --git a/src/types/stmts-failed/expr-conditional-branch-mismatch.tact b/src/060-types/stmts-failed/expr-conditional-branch-mismatch.tact similarity index 100% rename from src/types/stmts-failed/expr-conditional-branch-mismatch.tact rename to src/060-types/stmts-failed/expr-conditional-branch-mismatch.tact diff --git a/src/types/stmts-failed/expr-conditional-non-optional-result-expected1.tact b/src/060-types/stmts-failed/expr-conditional-non-optional-result-expected1.tact similarity index 100% rename from src/types/stmts-failed/expr-conditional-non-optional-result-expected1.tact rename to src/060-types/stmts-failed/expr-conditional-non-optional-result-expected1.tact diff --git a/src/types/stmts-failed/expr-conditional-non-optional-result-expected2.tact b/src/060-types/stmts-failed/expr-conditional-non-optional-result-expected2.tact similarity index 100% rename from src/types/stmts-failed/expr-conditional-non-optional-result-expected2.tact rename to src/060-types/stmts-failed/expr-conditional-non-optional-result-expected2.tact diff --git a/src/types/stmts-failed/expr-conditional-non-optional-result-expected3.tact b/src/060-types/stmts-failed/expr-conditional-non-optional-result-expected3.tact similarity index 100% rename from src/types/stmts-failed/expr-conditional-non-optional-result-expected3.tact rename to src/060-types/stmts-failed/expr-conditional-non-optional-result-expected3.tact diff --git a/src/types/stmts-failed/expr-conditional-result-mismatch.tact b/src/060-types/stmts-failed/expr-conditional-result-mismatch.tact similarity index 100% rename from src/types/stmts-failed/expr-conditional-result-mismatch.tact rename to src/060-types/stmts-failed/expr-conditional-result-mismatch.tact diff --git a/src/types/stmts-failed/expr-conditional-void-branches copy.tact b/src/060-types/stmts-failed/expr-conditional-void-branches copy.tact similarity index 100% rename from src/types/stmts-failed/expr-conditional-void-branches copy.tact rename to src/060-types/stmts-failed/expr-conditional-void-branches copy.tact diff --git a/src/types/stmts-failed/expr-eq-bounced.tact b/src/060-types/stmts-failed/expr-eq-bounced.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-bounced.tact rename to src/060-types/stmts-failed/expr-eq-bounced.tact diff --git a/src/types/stmts-failed/expr-eq-builder.tact b/src/060-types/stmts-failed/expr-eq-builder.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-builder.tact rename to src/060-types/stmts-failed/expr-eq-builder.tact diff --git a/src/types/stmts-failed/expr-eq-contract.tact b/src/060-types/stmts-failed/expr-eq-contract.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-contract.tact rename to src/060-types/stmts-failed/expr-eq-contract.tact diff --git a/src/types/stmts-failed/expr-eq-int-bool.tact b/src/060-types/stmts-failed/expr-eq-int-bool.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-int-bool.tact rename to src/060-types/stmts-failed/expr-eq-int-bool.tact diff --git a/src/types/stmts-failed/expr-eq-map-map.tact b/src/060-types/stmts-failed/expr-eq-map-map.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-map-map.tact rename to src/060-types/stmts-failed/expr-eq-map-map.tact diff --git a/src/types/stmts-failed/expr-eq-null-1.tact b/src/060-types/stmts-failed/expr-eq-null-1.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-null-1.tact rename to src/060-types/stmts-failed/expr-eq-null-1.tact diff --git a/src/types/stmts-failed/expr-eq-null-2.tact b/src/060-types/stmts-failed/expr-eq-null-2.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-null-2.tact rename to src/060-types/stmts-failed/expr-eq-null-2.tact diff --git a/src/types/stmts-failed/expr-eq-null-3.tact b/src/060-types/stmts-failed/expr-eq-null-3.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-null-3.tact rename to src/060-types/stmts-failed/expr-eq-null-3.tact diff --git a/src/types/stmts-failed/expr-eq-null-bounced.tact b/src/060-types/stmts-failed/expr-eq-null-bounced.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-null-bounced.tact rename to src/060-types/stmts-failed/expr-eq-null-bounced.tact diff --git a/src/types/stmts-failed/expr-eq-optional-builder.tact b/src/060-types/stmts-failed/expr-eq-optional-builder.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-optional-builder.tact rename to src/060-types/stmts-failed/expr-eq-optional-builder.tact diff --git a/src/types/stmts-failed/expr-eq-optional-stringbuilder.tact b/src/060-types/stmts-failed/expr-eq-optional-stringbuilder.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-optional-stringbuilder.tact rename to src/060-types/stmts-failed/expr-eq-optional-stringbuilder.tact diff --git a/src/types/stmts-failed/expr-eq-optional-struct-null.tact b/src/060-types/stmts-failed/expr-eq-optional-struct-null.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-optional-struct-null.tact rename to src/060-types/stmts-failed/expr-eq-optional-struct-null.tact diff --git a/src/types/stmts-failed/expr-eq-optional-struct.tact b/src/060-types/stmts-failed/expr-eq-optional-struct.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-optional-struct.tact rename to src/060-types/stmts-failed/expr-eq-optional-struct.tact diff --git a/src/types/stmts-failed/expr-eq-stringbuilder.tact b/src/060-types/stmts-failed/expr-eq-stringbuilder.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-stringbuilder.tact rename to src/060-types/stmts-failed/expr-eq-stringbuilder.tact diff --git a/src/types/stmts-failed/expr-eq-struct.tact b/src/060-types/stmts-failed/expr-eq-struct.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-struct.tact rename to src/060-types/stmts-failed/expr-eq-struct.tact diff --git a/src/types/stmts-failed/expr-eq-void-null.tact b/src/060-types/stmts-failed/expr-eq-void-null.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-void-null.tact rename to src/060-types/stmts-failed/expr-eq-void-null.tact diff --git a/src/types/stmts-failed/expr-eq-void1.tact b/src/060-types/stmts-failed/expr-eq-void1.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-void1.tact rename to src/060-types/stmts-failed/expr-eq-void1.tact diff --git a/src/types/stmts-failed/expr-eq-void2.tact b/src/060-types/stmts-failed/expr-eq-void2.tact similarity index 100% rename from src/types/stmts-failed/expr-eq-void2.tact rename to src/060-types/stmts-failed/expr-eq-void2.tact diff --git a/src/types/stmts-failed/expr-field-does-not-exist-but-method-does.tact b/src/060-types/stmts-failed/expr-field-does-not-exist-but-method-does.tact similarity index 100% rename from src/types/stmts-failed/expr-field-does-not-exist-but-method-does.tact rename to src/060-types/stmts-failed/expr-field-does-not-exist-but-method-does.tact diff --git a/src/types/stmts-failed/expr-field-does-not-exist.tact b/src/060-types/stmts-failed/expr-field-does-not-exist.tact similarity index 100% rename from src/types/stmts-failed/expr-field-does-not-exist.tact rename to src/060-types/stmts-failed/expr-field-does-not-exist.tact diff --git a/src/types/stmts-failed/expr-internal-fun-call-bool-param.tact.tact b/src/060-types/stmts-failed/expr-internal-fun-call-bool-param.tact.tact similarity index 100% rename from src/types/stmts-failed/expr-internal-fun-call-bool-param.tact.tact rename to src/060-types/stmts-failed/expr-internal-fun-call-bool-param.tact.tact diff --git a/src/types/stmts-failed/expr-map-del-method-is-non-void.tact b/src/060-types/stmts-failed/expr-map-del-method-is-non-void.tact similarity index 100% rename from src/types/stmts-failed/expr-map-del-method-is-non-void.tact rename to src/060-types/stmts-failed/expr-map-del-method-is-non-void.tact diff --git a/src/types/stmts-failed/expr-map-exists-method-not-bool.tact b/src/060-types/stmts-failed/expr-map-exists-method-not-bool.tact similarity index 100% rename from src/types/stmts-failed/expr-map-exists-method-not-bool.tact rename to src/060-types/stmts-failed/expr-map-exists-method-not-bool.tact diff --git a/src/types/stmts-failed/expr-map-exists-method-on-not-map.tact b/src/060-types/stmts-failed/expr-map-exists-method-on-not-map.tact similarity index 100% rename from src/types/stmts-failed/expr-map-exists-method-on-not-map.tact rename to src/060-types/stmts-failed/expr-map-exists-method-on-not-map.tact diff --git a/src/types/stmts-failed/expr-method-does-not-exist-but-field-does.tact b/src/060-types/stmts-failed/expr-method-does-not-exist-but-field-does.tact similarity index 100% rename from src/types/stmts-failed/expr-method-does-not-exist-but-field-does.tact rename to src/060-types/stmts-failed/expr-method-does-not-exist-but-field-does.tact diff --git a/src/types/stmts-failed/expr-module-fun-call-bool-param.tact b/src/060-types/stmts-failed/expr-module-fun-call-bool-param.tact similarity index 100% rename from src/types/stmts-failed/expr-module-fun-call-bool-param.tact rename to src/060-types/stmts-failed/expr-module-fun-call-bool-param.tact diff --git a/src/types/stmts-failed/expr-struct-duplicate-field.tact b/src/060-types/stmts-failed/expr-struct-duplicate-field.tact similarity index 100% rename from src/types/stmts-failed/expr-struct-duplicate-field.tact rename to src/060-types/stmts-failed/expr-struct-duplicate-field.tact diff --git a/src/types/stmts-failed/expr-struct-impossible-field-punning.tact b/src/060-types/stmts-failed/expr-struct-impossible-field-punning.tact similarity index 100% rename from src/types/stmts-failed/expr-struct-impossible-field-punning.tact rename to src/060-types/stmts-failed/expr-struct-impossible-field-punning.tact diff --git a/src/types/stmts-failed/expr-struct-missing-field.tact b/src/060-types/stmts-failed/expr-struct-missing-field.tact similarity index 100% rename from src/types/stmts-failed/expr-struct-missing-field.tact rename to src/060-types/stmts-failed/expr-struct-missing-field.tact diff --git a/src/types/stmts-failed/expr-struct-wrong-field-type.tact b/src/060-types/stmts-failed/expr-struct-wrong-field-type.tact similarity index 100% rename from src/types/stmts-failed/expr-struct-wrong-field-type.tact rename to src/060-types/stmts-failed/expr-struct-wrong-field-type.tact diff --git a/src/types/stmts-failed/expr-var-int-bool.tact b/src/060-types/stmts-failed/expr-var-int-bool.tact similarity index 100% rename from src/types/stmts-failed/expr-var-int-bool.tact rename to src/060-types/stmts-failed/expr-var-int-bool.tact diff --git a/src/types/stmts-failed/expr-wrong-arity-internal-fun.tact b/src/060-types/stmts-failed/expr-wrong-arity-internal-fun.tact similarity index 100% rename from src/types/stmts-failed/expr-wrong-arity-internal-fun.tact rename to src/060-types/stmts-failed/expr-wrong-arity-internal-fun.tact diff --git a/src/types/stmts-failed/expr-wrong-arity-module-fun.tact b/src/060-types/stmts-failed/expr-wrong-arity-module-fun.tact similarity index 100% rename from src/types/stmts-failed/expr-wrong-arity-module-fun.tact rename to src/060-types/stmts-failed/expr-wrong-arity-module-fun.tact diff --git a/src/types/stmts-failed/getter-collision-trait.tact b/src/060-types/stmts-failed/getter-collision-trait.tact similarity index 100% rename from src/types/stmts-failed/getter-collision-trait.tact rename to src/060-types/stmts-failed/getter-collision-trait.tact diff --git a/src/types/stmts-failed/getter-collision-with-reserved1.tact b/src/060-types/stmts-failed/getter-collision-with-reserved1.tact similarity index 100% rename from src/types/stmts-failed/getter-collision-with-reserved1.tact rename to src/060-types/stmts-failed/getter-collision-with-reserved1.tact diff --git a/src/types/stmts-failed/getter-collision-with-reserved2.tact b/src/060-types/stmts-failed/getter-collision-with-reserved2.tact similarity index 100% rename from src/types/stmts-failed/getter-collision-with-reserved2.tact rename to src/060-types/stmts-failed/getter-collision-with-reserved2.tact diff --git a/src/types/stmts-failed/getter-collision-with-reserved3.tact b/src/060-types/stmts-failed/getter-collision-with-reserved3.tact similarity index 100% rename from src/types/stmts-failed/getter-collision-with-reserved3.tact rename to src/060-types/stmts-failed/getter-collision-with-reserved3.tact diff --git a/src/types/stmts-failed/getter-collision-with-reserved_opt1.tact b/src/060-types/stmts-failed/getter-collision-with-reserved_opt1.tact similarity index 100% rename from src/types/stmts-failed/getter-collision-with-reserved_opt1.tact rename to src/060-types/stmts-failed/getter-collision-with-reserved_opt1.tact diff --git a/src/types/stmts-failed/getter-collision-with-reserved_opt2.tact b/src/060-types/stmts-failed/getter-collision-with-reserved_opt2.tact similarity index 100% rename from src/types/stmts-failed/getter-collision-with-reserved_opt2.tact rename to src/060-types/stmts-failed/getter-collision-with-reserved_opt2.tact diff --git a/src/types/stmts-failed/getter-collision-with-reserved_opt3.tact b/src/060-types/stmts-failed/getter-collision-with-reserved_opt3.tact similarity index 100% rename from src/types/stmts-failed/getter-collision-with-reserved_opt3.tact rename to src/060-types/stmts-failed/getter-collision-with-reserved_opt3.tact diff --git a/src/types/stmts-failed/getter-collision-with-trait.tact b/src/060-types/stmts-failed/getter-collision-with-trait.tact similarity index 100% rename from src/types/stmts-failed/getter-collision-with-trait.tact rename to src/060-types/stmts-failed/getter-collision-with-trait.tact diff --git a/src/types/stmts-failed/getter-collision.tact b/src/060-types/stmts-failed/getter-collision.tact similarity index 100% rename from src/types/stmts-failed/getter-collision.tact rename to src/060-types/stmts-failed/getter-collision.tact diff --git a/src/types/stmts-failed/init-vars-analysis-if.tact b/src/060-types/stmts-failed/init-vars-analysis-if.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-if.tact rename to src/060-types/stmts-failed/init-vars-analysis-if.tact diff --git a/src/types/stmts-failed/init-vars-analysis-implicit-init.tact b/src/060-types/stmts-failed/init-vars-analysis-implicit-init.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-implicit-init.tact rename to src/060-types/stmts-failed/init-vars-analysis-implicit-init.tact diff --git a/src/types/stmts-failed/init-vars-analysis-missing-storage-var.tact b/src/060-types/stmts-failed/init-vars-analysis-missing-storage-var.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-missing-storage-var.tact rename to src/060-types/stmts-failed/init-vars-analysis-missing-storage-var.tact diff --git a/src/types/stmts-failed/init-vars-analysis-used-uninit-storage-augmented-assign1.tact b/src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-augmented-assign1.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-used-uninit-storage-augmented-assign1.tact rename to src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-augmented-assign1.tact diff --git a/src/types/stmts-failed/init-vars-analysis-used-uninit-storage-augmented-assign2.tact b/src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-augmented-assign2.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-used-uninit-storage-augmented-assign2.tact rename to src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-augmented-assign2.tact diff --git a/src/types/stmts-failed/init-vars-analysis-used-uninit-storage-override-fun-call.tact b/src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-override-fun-call.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-used-uninit-storage-override-fun-call.tact rename to src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-override-fun-call.tact diff --git a/src/types/stmts-failed/init-vars-analysis-used-uninit-storage-struct1.tact b/src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-struct1.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-used-uninit-storage-struct1.tact rename to src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-struct1.tact diff --git a/src/types/stmts-failed/init-vars-analysis-used-uninit-storage-struct2.tact b/src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-struct2.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-used-uninit-storage-struct2.tact rename to src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-struct2.tact diff --git a/src/types/stmts-failed/init-vars-analysis-used-uninit-storage-var-fun-call.tact b/src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-var-fun-call.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-used-uninit-storage-var-fun-call.tact rename to src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-var-fun-call.tact diff --git a/src/types/stmts-failed/init-vars-analysis-used-uninit-storage-var.tact b/src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-var.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-used-uninit-storage-var.tact rename to src/060-types/stmts-failed/init-vars-analysis-used-uninit-storage-var.tact diff --git a/src/types/stmts-failed/init-vars-analysis-with-if-else.tact b/src/060-types/stmts-failed/init-vars-analysis-with-if-else.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-with-if-else.tact rename to src/060-types/stmts-failed/init-vars-analysis-with-if-else.tact diff --git a/src/types/stmts-failed/init-vars-analysis-with-if-elseif.tact b/src/060-types/stmts-failed/init-vars-analysis-with-if-elseif.tact similarity index 100% rename from src/types/stmts-failed/init-vars-analysis-with-if-elseif.tact rename to src/060-types/stmts-failed/init-vars-analysis-with-if-elseif.tact diff --git a/src/types/stmts-failed/return-analysis-catch-if.tact b/src/060-types/stmts-failed/return-analysis-catch-if.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-catch-if.tact rename to src/060-types/stmts-failed/return-analysis-catch-if.tact diff --git a/src/types/stmts-failed/return-analysis-do-if.tact b/src/060-types/stmts-failed/return-analysis-do-if.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-do-if.tact rename to src/060-types/stmts-failed/return-analysis-do-if.tact diff --git a/src/types/stmts-failed/return-analysis-if.tact b/src/060-types/stmts-failed/return-analysis-if.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-if.tact rename to src/060-types/stmts-failed/return-analysis-if.tact diff --git a/src/types/stmts-failed/return-analysis-non-void1.tact b/src/060-types/stmts-failed/return-analysis-non-void1.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-non-void1.tact rename to src/060-types/stmts-failed/return-analysis-non-void1.tact diff --git a/src/types/stmts-failed/return-analysis-non-void2.tact b/src/060-types/stmts-failed/return-analysis-non-void2.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-non-void2.tact rename to src/060-types/stmts-failed/return-analysis-non-void2.tact diff --git a/src/types/stmts-failed/return-analysis-repeat.tact b/src/060-types/stmts-failed/return-analysis-repeat.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-repeat.tact rename to src/060-types/stmts-failed/return-analysis-repeat.tact diff --git a/src/types/stmts-failed/return-analysis-separate-ifs.tact b/src/060-types/stmts-failed/return-analysis-separate-ifs.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-separate-ifs.tact rename to src/060-types/stmts-failed/return-analysis-separate-ifs.tact diff --git a/src/types/stmts-failed/return-analysis-throw-wrapped.tact b/src/060-types/stmts-failed/return-analysis-throw-wrapped.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-throw-wrapped.tact rename to src/060-types/stmts-failed/return-analysis-throw-wrapped.tact diff --git a/src/types/stmts-failed/return-analysis-try1.tact b/src/060-types/stmts-failed/return-analysis-try1.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-try1.tact rename to src/060-types/stmts-failed/return-analysis-try1.tact diff --git a/src/types/stmts-failed/return-analysis-try2.tact b/src/060-types/stmts-failed/return-analysis-try2.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-try2.tact rename to src/060-types/stmts-failed/return-analysis-try2.tact diff --git a/src/types/stmts-failed/return-analysis-while.tact b/src/060-types/stmts-failed/return-analysis-while.tact similarity index 100% rename from src/types/stmts-failed/return-analysis-while.tact rename to src/060-types/stmts-failed/return-analysis-while.tact diff --git a/src/types/stmts-failed/stmt-assgn-int-string.tact b/src/060-types/stmts-failed/stmt-assgn-int-string.tact similarity index 100% rename from src/types/stmts-failed/stmt-assgn-int-string.tact rename to src/060-types/stmts-failed/stmt-assgn-int-string.tact diff --git a/src/types/stmts-failed/stmt-augmented-assgn-bool-int.tact b/src/060-types/stmts-failed/stmt-augmented-assgn-bool-int.tact similarity index 100% rename from src/types/stmts-failed/stmt-augmented-assgn-bool-int.tact rename to src/060-types/stmts-failed/stmt-augmented-assgn-bool-int.tact diff --git a/src/types/stmts-failed/stmt-augmented-assgn-bool.tact b/src/060-types/stmts-failed/stmt-augmented-assgn-bool.tact similarity index 100% rename from src/types/stmts-failed/stmt-augmented-assgn-bool.tact rename to src/060-types/stmts-failed/stmt-augmented-assgn-bool.tact diff --git a/src/types/stmts-failed/stmt-augmented-assgn-int-bool.tact b/src/060-types/stmts-failed/stmt-augmented-assgn-int-bool.tact similarity index 100% rename from src/types/stmts-failed/stmt-augmented-assgn-int-bool.tact rename to src/060-types/stmts-failed/stmt-augmented-assgn-int-bool.tact diff --git a/src/types/stmts-failed/stmt-augmented-assgn-int.tact b/src/060-types/stmts-failed/stmt-augmented-assgn-int.tact similarity index 100% rename from src/types/stmts-failed/stmt-augmented-assgn-int.tact rename to src/060-types/stmts-failed/stmt-augmented-assgn-int.tact diff --git a/src/types/stmts-failed/stmt-augmented-assgn-not-matching.tact b/src/060-types/stmts-failed/stmt-augmented-assgn-not-matching.tact similarity index 100% rename from src/types/stmts-failed/stmt-augmented-assgn-not-matching.tact rename to src/060-types/stmts-failed/stmt-augmented-assgn-not-matching.tact diff --git a/src/types/stmts-failed/stmt-augmented-assgn-string.tact b/src/060-types/stmts-failed/stmt-augmented-assgn-string.tact similarity index 100% rename from src/types/stmts-failed/stmt-augmented-assgn-string.tact rename to src/060-types/stmts-failed/stmt-augmented-assgn-string.tact diff --git a/src/types/stmts-failed/stmt-conditional-expr-stmt-void1.tact b/src/060-types/stmts-failed/stmt-conditional-expr-stmt-void1.tact similarity index 100% rename from src/types/stmts-failed/stmt-conditional-expr-stmt-void1.tact rename to src/060-types/stmts-failed/stmt-conditional-expr-stmt-void1.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-duplicate-id.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-duplicate-id.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-duplicate-id.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-duplicate-id.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-non-destructable-opt.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-non-destructable-opt.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-non-destructable-opt.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-non-destructable-opt.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-non-destructable.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-non-destructable.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-non-destructable.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-non-destructable.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-non-destructable2.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-non-destructable2.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-non-destructable2.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-non-destructable2.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-non-existing-punned.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-non-existing-punned.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-non-existing-punned.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-non-existing-punned.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-non-existing-punned2.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-non-existing-punned2.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-non-existing-punned2.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-non-existing-punned2.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-non-existing-underscore.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-non-existing-underscore.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-non-existing-underscore.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-non-existing-underscore.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-non-existing.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-non-existing.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-non-existing.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-non-existing.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-shadowed-const-id.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-shadowed-const-id.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-shadowed-const-id.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-shadowed-const-id.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-shadowed-id.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-shadowed-id.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-shadowed-id.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-shadowed-id.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-wrong-count.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-wrong-count.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-wrong-count.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-wrong-count.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-wrong-count2.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-wrong-count2.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-wrong-count2.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-wrong-count2.tact diff --git a/src/types/stmts-failed/stmt-destructuring-fields-wrong-type.tact b/src/060-types/stmts-failed/stmt-destructuring-fields-wrong-type.tact similarity index 100% rename from src/types/stmts-failed/stmt-destructuring-fields-wrong-type.tact rename to src/060-types/stmts-failed/stmt-destructuring-fields-wrong-type.tact diff --git a/src/types/stmts-failed/stmt-do-int.tact b/src/060-types/stmts-failed/stmt-do-int.tact similarity index 100% rename from src/types/stmts-failed/stmt-do-int.tact rename to src/060-types/stmts-failed/stmt-do-int.tact diff --git a/src/types/stmts-failed/stmt-foreach-non-map.tact b/src/060-types/stmts-failed/stmt-foreach-non-map.tact similarity index 100% rename from src/types/stmts-failed/stmt-foreach-non-map.tact rename to src/060-types/stmts-failed/stmt-foreach-non-map.tact diff --git a/src/types/stmts-failed/stmt-foreach-non-path-map.tact b/src/060-types/stmts-failed/stmt-foreach-non-path-map.tact similarity index 100% rename from src/types/stmts-failed/stmt-foreach-non-path-map.tact rename to src/060-types/stmts-failed/stmt-foreach-non-path-map.tact diff --git a/src/types/stmts-failed/stmt-if-int.tact b/src/060-types/stmts-failed/stmt-if-int.tact similarity index 100% rename from src/types/stmts-failed/stmt-if-int.tact rename to src/060-types/stmts-failed/stmt-if-int.tact diff --git a/src/types/stmts-failed/stmt-let-unknown-type-inference.tact b/src/060-types/stmts-failed/stmt-let-unknown-type-inference.tact similarity index 100% rename from src/types/stmts-failed/stmt-let-unknown-type-inference.tact rename to src/060-types/stmts-failed/stmt-let-unknown-type-inference.tact diff --git a/src/types/stmts-failed/stmt-let-unknown-type-inference2.tact b/src/060-types/stmts-failed/stmt-let-unknown-type-inference2.tact similarity index 100% rename from src/types/stmts-failed/stmt-let-unknown-type-inference2.tact rename to src/060-types/stmts-failed/stmt-let-unknown-type-inference2.tact diff --git a/src/types/stmts-failed/stmt-let-void-inference.tact b/src/060-types/stmts-failed/stmt-let-void-inference.tact similarity index 100% rename from src/types/stmts-failed/stmt-let-void-inference.tact rename to src/060-types/stmts-failed/stmt-let-void-inference.tact diff --git a/src/types/stmts-failed/stmt-let-wrong-rhs.tact b/src/060-types/stmts-failed/stmt-let-wrong-rhs.tact similarity index 100% rename from src/types/stmts-failed/stmt-let-wrong-rhs.tact rename to src/060-types/stmts-failed/stmt-let-wrong-rhs.tact diff --git a/src/types/stmts-failed/stmt-repeat-bool.tact b/src/060-types/stmts-failed/stmt-repeat-bool.tact similarity index 100% rename from src/types/stmts-failed/stmt-repeat-bool.tact rename to src/060-types/stmts-failed/stmt-repeat-bool.tact diff --git a/src/types/stmts-failed/stmt-return-from-try-and-catch.tact b/src/060-types/stmts-failed/stmt-return-from-try-and-catch.tact similarity index 100% rename from src/types/stmts-failed/stmt-return-from-try-and-catch.tact rename to src/060-types/stmts-failed/stmt-return-from-try-and-catch.tact diff --git a/src/types/stmts-failed/stmt-return-void1.tact b/src/060-types/stmts-failed/stmt-return-void1.tact similarity index 100% rename from src/types/stmts-failed/stmt-return-void1.tact rename to src/060-types/stmts-failed/stmt-return-void1.tact diff --git a/src/types/stmts-failed/stmt-return-void2.tact b/src/060-types/stmts-failed/stmt-return-void2.tact similarity index 100% rename from src/types/stmts-failed/stmt-return-void2.tact rename to src/060-types/stmts-failed/stmt-return-void2.tact diff --git a/src/types/stmts-failed/stmt-return-void3.tact b/src/060-types/stmts-failed/stmt-return-void3.tact similarity index 100% rename from src/types/stmts-failed/stmt-return-void3.tact rename to src/060-types/stmts-failed/stmt-return-void3.tact diff --git a/src/types/stmts-failed/stmt-unboxing-expr-stmt-void.tact b/src/060-types/stmts-failed/stmt-unboxing-expr-stmt-void.tact similarity index 100% rename from src/types/stmts-failed/stmt-unboxing-expr-stmt-void.tact rename to src/060-types/stmts-failed/stmt-unboxing-expr-stmt-void.tact diff --git a/src/types/stmts-failed/stmt-while-int.tact b/src/060-types/stmts-failed/stmt-while-int.tact similarity index 100% rename from src/types/stmts-failed/stmt-while-int.tact rename to src/060-types/stmts-failed/stmt-while-int.tact diff --git a/src/types/stmts-failed/usage-of-bounced-field-in-type-that-is-too-big-2.tact b/src/060-types/stmts-failed/usage-of-bounced-field-in-type-that-is-too-big-2.tact similarity index 100% rename from src/types/stmts-failed/usage-of-bounced-field-in-type-that-is-too-big-2.tact rename to src/060-types/stmts-failed/usage-of-bounced-field-in-type-that-is-too-big-2.tact diff --git a/src/types/stmts-failed/usage-of-bounced-field-in-type-that-is-too-big.tact b/src/060-types/stmts-failed/usage-of-bounced-field-in-type-that-is-too-big.tact similarity index 100% rename from src/types/stmts-failed/usage-of-bounced-field-in-type-that-is-too-big.tact rename to src/060-types/stmts-failed/usage-of-bounced-field-in-type-that-is-too-big.tact diff --git a/src/types/stmts-failed/usage-of-bounced-field-that-is-too-big.tact b/src/060-types/stmts-failed/usage-of-bounced-field-that-is-too-big.tact similarity index 100% rename from src/types/stmts-failed/usage-of-bounced-field-that-is-too-big.tact rename to src/060-types/stmts-failed/usage-of-bounced-field-that-is-too-big.tact diff --git a/src/types/stmts-failed/var-does-not-exist.tact b/src/060-types/stmts-failed/var-does-not-exist.tact similarity index 100% rename from src/types/stmts-failed/var-does-not-exist.tact rename to src/060-types/stmts-failed/var-does-not-exist.tact diff --git a/src/types/stmts-failed/var-does-not-exist2.tact b/src/060-types/stmts-failed/var-does-not-exist2.tact similarity index 100% rename from src/types/stmts-failed/var-does-not-exist2.tact rename to src/060-types/stmts-failed/var-does-not-exist2.tact diff --git a/src/types/stmts-failed/var-does-not-exist3.tact b/src/060-types/stmts-failed/var-does-not-exist3.tact similarity index 100% rename from src/types/stmts-failed/var-does-not-exist3.tact rename to src/060-types/stmts-failed/var-does-not-exist3.tact diff --git a/src/types/stmts-failed/var-does-not-exist4.tact b/src/060-types/stmts-failed/var-does-not-exist4.tact similarity index 100% rename from src/types/stmts-failed/var-does-not-exist4.tact rename to src/060-types/stmts-failed/var-does-not-exist4.tact diff --git a/src/types/stmts-failed/var-scope-catch-does-not-shadow-outer-const.tact b/src/060-types/stmts-failed/var-scope-catch-does-not-shadow-outer-const.tact similarity index 100% rename from src/types/stmts-failed/var-scope-catch-does-not-shadow-outer-const.tact rename to src/060-types/stmts-failed/var-scope-catch-does-not-shadow-outer-const.tact diff --git a/src/types/stmts-failed/var-scope-catch-does-not-shadow-outer-var.tact b/src/060-types/stmts-failed/var-scope-catch-does-not-shadow-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-catch-does-not-shadow-outer-var.tact rename to src/060-types/stmts-failed/var-scope-catch-does-not-shadow-outer-var.tact diff --git a/src/types/stmts-failed/var-scope-catch-param-does-not-shadow-outer-var.tact b/src/060-types/stmts-failed/var-scope-catch-param-does-not-shadow-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-catch-param-does-not-shadow-outer-var.tact rename to src/060-types/stmts-failed/var-scope-catch-param-does-not-shadow-outer-var.tact diff --git a/src/types/stmts-failed/var-scope-catch-param-is-not-visible-in-try.tact b/src/060-types/stmts-failed/var-scope-catch-param-is-not-visible-in-try.tact similarity index 100% rename from src/types/stmts-failed/var-scope-catch-param-is-not-visible-in-try.tact rename to src/060-types/stmts-failed/var-scope-catch-param-is-not-visible-in-try.tact diff --git a/src/types/stmts-failed/var-scope-const-shadowing-catch.tact b/src/060-types/stmts-failed/var-scope-const-shadowing-catch.tact similarity index 100% rename from src/types/stmts-failed/var-scope-const-shadowing-catch.tact rename to src/060-types/stmts-failed/var-scope-const-shadowing-catch.tact diff --git a/src/types/stmts-failed/var-scope-const-shadowing-external-param.tact b/src/060-types/stmts-failed/var-scope-const-shadowing-external-param.tact similarity index 100% rename from src/types/stmts-failed/var-scope-const-shadowing-external-param.tact rename to src/060-types/stmts-failed/var-scope-const-shadowing-external-param.tact diff --git a/src/types/stmts-failed/var-scope-const-shadowing-foreach.tact b/src/060-types/stmts-failed/var-scope-const-shadowing-foreach.tact similarity index 100% rename from src/types/stmts-failed/var-scope-const-shadowing-foreach.tact rename to src/060-types/stmts-failed/var-scope-const-shadowing-foreach.tact diff --git a/src/types/stmts-failed/var-scope-const-shadowing-fun-param.tact b/src/060-types/stmts-failed/var-scope-const-shadowing-fun-param.tact similarity index 100% rename from src/types/stmts-failed/var-scope-const-shadowing-fun-param.tact rename to src/060-types/stmts-failed/var-scope-const-shadowing-fun-param.tact diff --git a/src/types/stmts-failed/var-scope-const-shadowing-let.tact b/src/060-types/stmts-failed/var-scope-const-shadowing-let.tact similarity index 100% rename from src/types/stmts-failed/var-scope-const-shadowing-let.tact rename to src/060-types/stmts-failed/var-scope-const-shadowing-let.tact diff --git a/src/types/stmts-failed/var-scope-const-shadowing-receiver-param.tact b/src/060-types/stmts-failed/var-scope-const-shadowing-receiver-param.tact similarity index 100% rename from src/types/stmts-failed/var-scope-const-shadowing-receiver-param.tact rename to src/060-types/stmts-failed/var-scope-const-shadowing-receiver-param.tact diff --git a/src/types/stmts-failed/var-scope-do-until-shadows-outer-const.tact b/src/060-types/stmts-failed/var-scope-do-until-shadows-outer-const.tact similarity index 100% rename from src/types/stmts-failed/var-scope-do-until-shadows-outer-const.tact rename to src/060-types/stmts-failed/var-scope-do-until-shadows-outer-const.tact diff --git a/src/types/stmts-failed/var-scope-do-until-shadows-outer-var.tact b/src/060-types/stmts-failed/var-scope-do-until-shadows-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-do-until-shadows-outer-var.tact rename to src/060-types/stmts-failed/var-scope-do-until-shadows-outer-var.tact diff --git a/src/types/stmts-failed/var-scope-external-shadows-param.tact b/src/060-types/stmts-failed/var-scope-external-shadows-param.tact similarity index 100% rename from src/types/stmts-failed/var-scope-external-shadows-param.tact rename to src/060-types/stmts-failed/var-scope-external-shadows-param.tact diff --git a/src/types/stmts-failed/var-scope-foreach-internal-var-does-not-escape.tact b/src/060-types/stmts-failed/var-scope-foreach-internal-var-does-not-escape.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-internal-var-does-not-escape.tact rename to src/060-types/stmts-failed/var-scope-foreach-internal-var-does-not-escape.tact diff --git a/src/types/stmts-failed/var-scope-foreach-key-does-not-escape.tact b/src/060-types/stmts-failed/var-scope-foreach-key-does-not-escape.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-key-does-not-escape.tact rename to src/060-types/stmts-failed/var-scope-foreach-key-does-not-escape.tact diff --git a/src/types/stmts-failed/var-scope-foreach-key-shadows-map.tact b/src/060-types/stmts-failed/var-scope-foreach-key-shadows-map.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-key-shadows-map.tact rename to src/060-types/stmts-failed/var-scope-foreach-key-shadows-map.tact diff --git a/src/types/stmts-failed/var-scope-foreach-key-shadows-outer-var.tact b/src/060-types/stmts-failed/var-scope-foreach-key-shadows-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-key-shadows-outer-var.tact rename to src/060-types/stmts-failed/var-scope-foreach-key-shadows-outer-var.tact diff --git a/src/types/stmts-failed/var-scope-foreach-shadows-outer-const.tact b/src/060-types/stmts-failed/var-scope-foreach-shadows-outer-const.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-shadows-outer-const.tact rename to src/060-types/stmts-failed/var-scope-foreach-shadows-outer-const.tact diff --git a/src/types/stmts-failed/var-scope-foreach-shadows-outer-map.tact b/src/060-types/stmts-failed/var-scope-foreach-shadows-outer-map.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-shadows-outer-map.tact rename to src/060-types/stmts-failed/var-scope-foreach-shadows-outer-map.tact diff --git a/src/types/stmts-failed/var-scope-foreach-shadows-outer-var.tact b/src/060-types/stmts-failed/var-scope-foreach-shadows-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-shadows-outer-var.tact rename to src/060-types/stmts-failed/var-scope-foreach-shadows-outer-var.tact diff --git a/src/types/stmts-failed/var-scope-foreach-val-does-not-escape.tact b/src/060-types/stmts-failed/var-scope-foreach-val-does-not-escape.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-val-does-not-escape.tact rename to src/060-types/stmts-failed/var-scope-foreach-val-does-not-escape.tact diff --git a/src/types/stmts-failed/var-scope-foreach-val-shadows-const-map.tact b/src/060-types/stmts-failed/var-scope-foreach-val-shadows-const-map.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-val-shadows-const-map.tact rename to src/060-types/stmts-failed/var-scope-foreach-val-shadows-const-map.tact diff --git a/src/types/stmts-failed/var-scope-foreach-val-shadows-key.tact b/src/060-types/stmts-failed/var-scope-foreach-val-shadows-key.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-val-shadows-key.tact rename to src/060-types/stmts-failed/var-scope-foreach-val-shadows-key.tact diff --git a/src/types/stmts-failed/var-scope-foreach-val-shadows-map.tact b/src/060-types/stmts-failed/var-scope-foreach-val-shadows-map.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-val-shadows-map.tact rename to src/060-types/stmts-failed/var-scope-foreach-val-shadows-map.tact diff --git a/src/types/stmts-failed/var-scope-foreach-val-shadows-outer-var.tact b/src/060-types/stmts-failed/var-scope-foreach-val-shadows-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-foreach-val-shadows-outer-var.tact rename to src/060-types/stmts-failed/var-scope-foreach-val-shadows-outer-var.tact diff --git a/src/types/stmts-failed/var-scope-function-shadows-local-var.tact b/src/060-types/stmts-failed/var-scope-function-shadows-local-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-function-shadows-local-var.tact rename to src/060-types/stmts-failed/var-scope-function-shadows-local-var.tact diff --git a/src/types/stmts-failed/var-scope-function-shadows-param.tact b/src/060-types/stmts-failed/var-scope-function-shadows-param.tact similarity index 100% rename from src/types/stmts-failed/var-scope-function-shadows-param.tact rename to src/060-types/stmts-failed/var-scope-function-shadows-param.tact diff --git a/src/types/stmts-failed/var-scope-if-else-shadows-outer-const.tact b/src/060-types/stmts-failed/var-scope-if-else-shadows-outer-const.tact similarity index 100% rename from src/types/stmts-failed/var-scope-if-else-shadows-outer-const.tact rename to src/060-types/stmts-failed/var-scope-if-else-shadows-outer-const.tact diff --git a/src/types/stmts-failed/var-scope-if-else-shadows-outer-var.tact b/src/060-types/stmts-failed/var-scope-if-else-shadows-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-if-else-shadows-outer-var.tact rename to src/060-types/stmts-failed/var-scope-if-else-shadows-outer-var.tact diff --git a/src/types/stmts-failed/var-scope-if-then-shadows-outer-const.tact b/src/060-types/stmts-failed/var-scope-if-then-shadows-outer-const.tact similarity index 100% rename from src/types/stmts-failed/var-scope-if-then-shadows-outer-const.tact rename to src/060-types/stmts-failed/var-scope-if-then-shadows-outer-const.tact diff --git a/src/types/stmts-failed/var-scope-if-then-shadows-outer-var.tact b/src/060-types/stmts-failed/var-scope-if-then-shadows-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-if-then-shadows-outer-var.tact rename to src/060-types/stmts-failed/var-scope-if-then-shadows-outer-var.tact diff --git a/src/types/stmts-failed/var-scope-local-catch-param-does-not-escape.tact b/src/060-types/stmts-failed/var-scope-local-catch-param-does-not-escape.tact similarity index 100% rename from src/types/stmts-failed/var-scope-local-catch-param-does-not-escape.tact rename to src/060-types/stmts-failed/var-scope-local-catch-param-does-not-escape.tact diff --git a/src/types/stmts-failed/var-scope-local-loop-var-does-not-escape.tact b/src/060-types/stmts-failed/var-scope-local-loop-var-does-not-escape.tact similarity index 100% rename from src/types/stmts-failed/var-scope-local-loop-var-does-not-escape.tact rename to src/060-types/stmts-failed/var-scope-local-loop-var-does-not-escape.tact diff --git a/src/types/stmts-failed/var-scope-missing-storage-var.tact b/src/060-types/stmts-failed/var-scope-missing-storage-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-missing-storage-var.tact rename to src/060-types/stmts-failed/var-scope-missing-storage-var.tact diff --git a/src/types/stmts-failed/var-scope-no-toString-global-fun1.tact b/src/060-types/stmts-failed/var-scope-no-toString-global-fun1.tact similarity index 100% rename from src/types/stmts-failed/var-scope-no-toString-global-fun1.tact rename to src/060-types/stmts-failed/var-scope-no-toString-global-fun1.tact diff --git a/src/types/stmts-failed/var-scope-no-toString-global-fun2.tact b/src/060-types/stmts-failed/var-scope-no-toString-global-fun2.tact similarity index 100% rename from src/types/stmts-failed/var-scope-no-toString-global-fun2.tact rename to src/060-types/stmts-failed/var-scope-no-toString-global-fun2.tact diff --git a/src/types/stmts-failed/var-scope-no-valueOf-global-fun.tact b/src/060-types/stmts-failed/var-scope-no-valueOf-global-fun.tact similarity index 100% rename from src/types/stmts-failed/var-scope-no-valueOf-global-fun.tact rename to src/060-types/stmts-failed/var-scope-no-valueOf-global-fun.tact diff --git a/src/types/stmts-failed/var-scope-rec-fun-shadowing-catch.tact b/src/060-types/stmts-failed/var-scope-rec-fun-shadowing-catch.tact similarity index 100% rename from src/types/stmts-failed/var-scope-rec-fun-shadowing-catch.tact rename to src/060-types/stmts-failed/var-scope-rec-fun-shadowing-catch.tact diff --git a/src/types/stmts-failed/var-scope-rec-fun-shadowing-foreach.tact b/src/060-types/stmts-failed/var-scope-rec-fun-shadowing-foreach.tact similarity index 100% rename from src/types/stmts-failed/var-scope-rec-fun-shadowing-foreach.tact rename to src/060-types/stmts-failed/var-scope-rec-fun-shadowing-foreach.tact diff --git a/src/types/stmts-failed/var-scope-rec-fun-shadowing-fun-param.tact b/src/060-types/stmts-failed/var-scope-rec-fun-shadowing-fun-param.tact similarity index 100% rename from src/types/stmts-failed/var-scope-rec-fun-shadowing-fun-param.tact rename to src/060-types/stmts-failed/var-scope-rec-fun-shadowing-fun-param.tact diff --git a/src/types/stmts-failed/var-scope-rec-fun-shadowing-let.tact b/src/060-types/stmts-failed/var-scope-rec-fun-shadowing-let.tact similarity index 100% rename from src/types/stmts-failed/var-scope-rec-fun-shadowing-let.tact rename to src/060-types/stmts-failed/var-scope-rec-fun-shadowing-let.tact diff --git a/src/types/stmts-failed/var-scope-receiver-shadows-param.tact b/src/060-types/stmts-failed/var-scope-receiver-shadows-param.tact similarity index 100% rename from src/types/stmts-failed/var-scope-receiver-shadows-param.tact rename to src/060-types/stmts-failed/var-scope-receiver-shadows-param.tact diff --git a/src/types/stmts-failed/var-scope-repeat-shadows-outer-const.tact b/src/060-types/stmts-failed/var-scope-repeat-shadows-outer-const.tact similarity index 100% rename from src/types/stmts-failed/var-scope-repeat-shadows-outer-const.tact rename to src/060-types/stmts-failed/var-scope-repeat-shadows-outer-const.tact diff --git a/src/types/stmts-failed/var-scope-repeat-shadows-outer-var.tact b/src/060-types/stmts-failed/var-scope-repeat-shadows-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-repeat-shadows-outer-var.tact rename to src/060-types/stmts-failed/var-scope-repeat-shadows-outer-var.tact diff --git a/src/types/stmts-failed/var-scope-try-does-not-shadow-outer-const.tact b/src/060-types/stmts-failed/var-scope-try-does-not-shadow-outer-const.tact similarity index 100% rename from src/types/stmts-failed/var-scope-try-does-not-shadow-outer-const.tact rename to src/060-types/stmts-failed/var-scope-try-does-not-shadow-outer-const.tact diff --git a/src/types/stmts-failed/var-scope-try-does-not-shadow-outer-var.tact b/src/060-types/stmts-failed/var-scope-try-does-not-shadow-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-try-does-not-shadow-outer-var.tact rename to src/060-types/stmts-failed/var-scope-try-does-not-shadow-outer-var.tact diff --git a/src/types/stmts-failed/var-scope-while-shadows-outer-const.tact b/src/060-types/stmts-failed/var-scope-while-shadows-outer-const.tact similarity index 100% rename from src/types/stmts-failed/var-scope-while-shadows-outer-const.tact rename to src/060-types/stmts-failed/var-scope-while-shadows-outer-const.tact diff --git a/src/types/stmts-failed/var-scope-while-shadows-outer-var.tact b/src/060-types/stmts-failed/var-scope-while-shadows-outer-var.tact similarity index 100% rename from src/types/stmts-failed/var-scope-while-shadows-outer-var.tact rename to src/060-types/stmts-failed/var-scope-while-shadows-outer-var.tact diff --git a/src/types/stmts-failed/var-underscore-name-access.tact b/src/060-types/stmts-failed/var-underscore-name-access.tact similarity index 100% rename from src/types/stmts-failed/var-underscore-name-access.tact rename to src/060-types/stmts-failed/var-underscore-name-access.tact diff --git a/src/types/stmts-failed/var-underscore-name-access2.tact b/src/060-types/stmts-failed/var-underscore-name-access2.tact similarity index 100% rename from src/types/stmts-failed/var-underscore-name-access2.tact rename to src/060-types/stmts-failed/var-underscore-name-access2.tact diff --git a/src/types/stmts-failed/var-underscore-name-access3.tact b/src/060-types/stmts-failed/var-underscore-name-access3.tact similarity index 100% rename from src/types/stmts-failed/var-underscore-name-access3.tact rename to src/060-types/stmts-failed/var-underscore-name-access3.tact diff --git a/src/types/stmts-failed/wf-type-let.tact b/src/060-types/stmts-failed/wf-type-let.tact similarity index 100% rename from src/types/stmts-failed/wf-type-let.tact rename to src/060-types/stmts-failed/wf-type-let.tact diff --git a/src/types/stmts/assign-self-mutating-method.tact b/src/060-types/stmts/assign-self-mutating-method.tact similarity index 100% rename from src/types/stmts/assign-self-mutating-method.tact rename to src/060-types/stmts/assign-self-mutating-method.tact diff --git a/src/types/stmts/contract-getter-with-method-id-1.tact b/src/060-types/stmts/contract-getter-with-method-id-1.tact similarity index 100% rename from src/types/stmts/contract-getter-with-method-id-1.tact rename to src/060-types/stmts/contract-getter-with-method-id-1.tact diff --git a/src/types/stmts/contract-getter-with-method-id-2.tact b/src/060-types/stmts/contract-getter-with-method-id-2.tact similarity index 100% rename from src/types/stmts/contract-getter-with-method-id-2.tact rename to src/060-types/stmts/contract-getter-with-method-id-2.tact diff --git a/src/types/stmts/contract-getter-with-method-id-3.tact b/src/060-types/stmts/contract-getter-with-method-id-3.tact similarity index 100% rename from src/types/stmts/contract-getter-with-method-id-3.tact rename to src/060-types/stmts/contract-getter-with-method-id-3.tact diff --git a/src/types/stmts/contract-receiver-bounced.tact b/src/060-types/stmts/contract-receiver-bounced.tact similarity index 100% rename from src/types/stmts/contract-receiver-bounced.tact rename to src/060-types/stmts/contract-receiver-bounced.tact diff --git a/src/types/stmts/expr-arith-bool-cmp.tact b/src/060-types/stmts/expr-arith-bool-cmp.tact similarity index 100% rename from src/types/stmts/expr-arith-bool-cmp.tact rename to src/060-types/stmts/expr-arith-bool-cmp.tact diff --git a/src/types/stmts/expr-conditional-with-subtyping.tact b/src/060-types/stmts/expr-conditional-with-subtyping.tact similarity index 100% rename from src/types/stmts/expr-conditional-with-subtyping.tact rename to src/060-types/stmts/expr-conditional-with-subtyping.tact diff --git a/src/types/stmts/expr-eq-arith.tact b/src/060-types/stmts/expr-eq-arith.tact similarity index 100% rename from src/types/stmts/expr-eq-arith.tact rename to src/060-types/stmts/expr-eq-arith.tact diff --git a/src/types/stmts/expr-eq-int-optional-int.tact b/src/060-types/stmts/expr-eq-int-optional-int.tact similarity index 100% rename from src/types/stmts/expr-eq-int-optional-int.tact rename to src/060-types/stmts/expr-eq-int-optional-int.tact diff --git a/src/types/stmts/expr-eq-literal.tact b/src/060-types/stmts/expr-eq-literal.tact similarity index 100% rename from src/types/stmts/expr-eq-literal.tact rename to src/060-types/stmts/expr-eq-literal.tact diff --git a/src/types/stmts/expr-eq-map-map.tact b/src/060-types/stmts/expr-eq-map-map.tact similarity index 100% rename from src/types/stmts/expr-eq-map-map.tact rename to src/060-types/stmts/expr-eq-map-map.tact diff --git a/src/types/stmts/expr-eq-map-null.tact b/src/060-types/stmts/expr-eq-map-null.tact similarity index 100% rename from src/types/stmts/expr-eq-map-null.tact rename to src/060-types/stmts/expr-eq-map-null.tact diff --git a/src/types/stmts/expr-eq-null-null.tact b/src/060-types/stmts/expr-eq-null-null.tact similarity index 100% rename from src/types/stmts/expr-eq-null-null.tact rename to src/060-types/stmts/expr-eq-null-null.tact diff --git a/src/types/stmts/expr-eq-optional-int-null.tact b/src/060-types/stmts/expr-eq-optional-int-null.tact similarity index 100% rename from src/types/stmts/expr-eq-optional-int-null.tact rename to src/060-types/stmts/expr-eq-optional-int-null.tact diff --git a/src/types/stmts/expr-eq-optional-struct-null.tact b/src/060-types/stmts/expr-eq-optional-struct-null.tact similarity index 100% rename from src/types/stmts/expr-eq-optional-struct-null.tact rename to src/060-types/stmts/expr-eq-optional-struct-null.tact diff --git a/src/types/stmts/expr-field-access-method-call.tact b/src/060-types/stmts/expr-field-access-method-call.tact similarity index 100% rename from src/types/stmts/expr-field-access-method-call.tact rename to src/060-types/stmts/expr-field-access-method-call.tact diff --git a/src/types/stmts/expr-maps-del-method.tact b/src/060-types/stmts/expr-maps-del-method.tact similarity index 100% rename from src/types/stmts/expr-maps-del-method.tact rename to src/060-types/stmts/expr-maps-del-method.tact diff --git a/src/types/stmts/expr-maps-exists-method.tact b/src/060-types/stmts/expr-maps-exists-method.tact similarity index 100% rename from src/types/stmts/expr-maps-exists-method.tact rename to src/060-types/stmts/expr-maps-exists-method.tact diff --git a/src/types/stmts/expr-struct-construction.tact b/src/060-types/stmts/expr-struct-construction.tact similarity index 100% rename from src/types/stmts/expr-struct-construction.tact rename to src/060-types/stmts/expr-struct-construction.tact diff --git a/src/types/stmts/fun-extends-optional.tact b/src/060-types/stmts/fun-extends-optional.tact similarity index 100% rename from src/types/stmts/fun-extends-optional.tact rename to src/060-types/stmts/fun-extends-optional.tact diff --git a/src/types/stmts/init-vars-analysis-with-if.tact b/src/060-types/stmts/init-vars-analysis-with-if.tact similarity index 100% rename from src/types/stmts/init-vars-analysis-with-if.tact rename to src/060-types/stmts/init-vars-analysis-with-if.tact diff --git a/src/types/stmts/return-analysis-if-elseif.tact b/src/060-types/stmts/return-analysis-if-elseif.tact similarity index 100% rename from src/types/stmts/return-analysis-if-elseif.tact rename to src/060-types/stmts/return-analysis-if-elseif.tact diff --git a/src/types/stmts/return-analysis-if-try-catch-do-loop.tact b/src/060-types/stmts/return-analysis-if-try-catch-do-loop.tact similarity index 100% rename from src/types/stmts/return-analysis-if-try-catch-do-loop.tact rename to src/060-types/stmts/return-analysis-if-try-catch-do-loop.tact diff --git a/src/types/stmts/return-analysis-no-return-in-void1.tact b/src/060-types/stmts/return-analysis-no-return-in-void1.tact similarity index 100% rename from src/types/stmts/return-analysis-no-return-in-void1.tact rename to src/060-types/stmts/return-analysis-no-return-in-void1.tact diff --git a/src/types/stmts/return-analysis-no-return-in-void2.tact b/src/060-types/stmts/return-analysis-no-return-in-void2.tact similarity index 100% rename from src/types/stmts/return-analysis-no-return-in-void2.tact rename to src/060-types/stmts/return-analysis-no-return-in-void2.tact diff --git a/src/types/stmts/return-analysis-throw1.tact b/src/060-types/stmts/return-analysis-throw1.tact similarity index 100% rename from src/types/stmts/return-analysis-throw1.tact rename to src/060-types/stmts/return-analysis-throw1.tact diff --git a/src/types/stmts/return-analysis-throw2.tact b/src/060-types/stmts/return-analysis-throw2.tact similarity index 100% rename from src/types/stmts/return-analysis-throw2.tact rename to src/060-types/stmts/return-analysis-throw2.tact diff --git a/src/types/stmts/return-analysis-try-catch.tact b/src/060-types/stmts/return-analysis-try-catch.tact similarity index 100% rename from src/types/stmts/return-analysis-try-catch.tact rename to src/060-types/stmts/return-analysis-try-catch.tact diff --git a/src/types/stmts/stmt-augmented-assgn-bool.tact b/src/060-types/stmts/stmt-augmented-assgn-bool.tact similarity index 100% rename from src/types/stmts/stmt-augmented-assgn-bool.tact rename to src/060-types/stmts/stmt-augmented-assgn-bool.tact diff --git a/src/types/stmts/stmt-augmented-assgn-numerical-type.tact b/src/060-types/stmts/stmt-augmented-assgn-numerical-type.tact similarity index 100% rename from src/types/stmts/stmt-augmented-assgn-numerical-type.tact rename to src/060-types/stmts/stmt-augmented-assgn-numerical-type.tact diff --git a/src/types/stmts/stmt-destructuring.tact b/src/060-types/stmts/stmt-destructuring.tact similarity index 100% rename from src/types/stmts/stmt-destructuring.tact rename to src/060-types/stmts/stmt-destructuring.tact diff --git a/src/types/stmts/stmt-let-assgn-unbox.tact b/src/060-types/stmts/stmt-let-assgn-unbox.tact similarity index 100% rename from src/types/stmts/stmt-let-assgn-unbox.tact rename to src/060-types/stmts/stmt-let-assgn-unbox.tact diff --git a/src/types/stmts/stmt-let-assgn.tact b/src/060-types/stmts/stmt-let-assgn.tact similarity index 100% rename from src/types/stmts/stmt-let-assgn.tact rename to src/060-types/stmts/stmt-let-assgn.tact diff --git a/src/types/stmts/stmt-let-if-elseif.tact b/src/060-types/stmts/stmt-let-if-elseif.tact similarity index 100% rename from src/types/stmts/stmt-let-if-elseif.tact rename to src/060-types/stmts/stmt-let-if-elseif.tact diff --git a/src/types/stmts/stmt-let-map-type-inference.tact b/src/060-types/stmts/stmt-let-map-type-inference.tact similarity index 100% rename from src/types/stmts/stmt-let-map-type-inference.tact rename to src/060-types/stmts/stmt-let-map-type-inference.tact diff --git a/src/types/stmts/stmt-let-nullable-type-inference.tact b/src/060-types/stmts/stmt-let-nullable-type-inference.tact similarity index 100% rename from src/types/stmts/stmt-let-nullable-type-inference.tact rename to src/060-types/stmts/stmt-let-nullable-type-inference.tact diff --git a/src/types/stmts/var-scope-let-toString.tact b/src/060-types/stmts/var-scope-let-toString.tact similarity index 100% rename from src/types/stmts/var-scope-let-toString.tact rename to src/060-types/stmts/var-scope-let-toString.tact diff --git a/src/types/stmts/var-scope-repeat.tact b/src/060-types/stmts/var-scope-repeat.tact similarity index 100% rename from src/types/stmts/var-scope-repeat.tact rename to src/060-types/stmts/var-scope-repeat.tact diff --git a/src/types/stmts/var-scope-repeat2.tact b/src/060-types/stmts/var-scope-repeat2.tact similarity index 100% rename from src/types/stmts/var-scope-repeat2.tact rename to src/060-types/stmts/var-scope-repeat2.tact diff --git a/src/types/stmts/var-scope-toString-non-method.tact b/src/060-types/stmts/var-scope-toString-non-method.tact similarity index 100% rename from src/types/stmts/var-scope-toString-non-method.tact rename to src/060-types/stmts/var-scope-toString-non-method.tact diff --git a/src/types/stmts/var-scope-valueOf-fun.tact b/src/060-types/stmts/var-scope-valueOf-fun.tact similarity index 100% rename from src/types/stmts/var-scope-valueOf-fun.tact rename to src/060-types/stmts/var-scope-valueOf-fun.tact diff --git a/src/types/stmts/var-underscore-name-in-foreach.tact b/src/060-types/stmts/var-underscore-name-in-foreach.tact similarity index 100% rename from src/types/stmts/var-underscore-name-in-foreach.tact rename to src/060-types/stmts/var-underscore-name-in-foreach.tact diff --git a/src/types/stmts/var-underscore-name-in-foreach2.tact b/src/060-types/stmts/var-underscore-name-in-foreach2.tact similarity index 100% rename from src/types/stmts/var-underscore-name-in-foreach2.tact rename to src/060-types/stmts/var-underscore-name-in-foreach2.tact diff --git a/src/types/stmts/var-underscore-name-in-let.tact b/src/060-types/stmts/var-underscore-name-in-let.tact similarity index 100% rename from src/types/stmts/var-underscore-name-in-let.tact rename to src/060-types/stmts/var-underscore-name-in-let.tact diff --git a/src/types/subtyping.ts b/src/060-types/subtyping.ts similarity index 100% rename from src/types/subtyping.ts rename to src/060-types/subtyping.ts diff --git a/src/types/test-failed/asm-fun-shuffle-arg-duplicate.tact b/src/060-types/test-failed/asm-fun-shuffle-arg-duplicate.tact similarity index 100% rename from src/types/test-failed/asm-fun-shuffle-arg-duplicate.tact rename to src/060-types/test-failed/asm-fun-shuffle-arg-duplicate.tact diff --git a/src/types/test-failed/asm-fun-shuffle-arg-missing-and-non-existent-param.tact b/src/060-types/test-failed/asm-fun-shuffle-arg-missing-and-non-existent-param.tact similarity index 100% rename from src/types/test-failed/asm-fun-shuffle-arg-missing-and-non-existent-param.tact rename to src/060-types/test-failed/asm-fun-shuffle-arg-missing-and-non-existent-param.tact diff --git a/src/types/test-failed/asm-fun-shuffle-arg-missing-param.tact b/src/060-types/test-failed/asm-fun-shuffle-arg-missing-param.tact similarity index 100% rename from src/types/test-failed/asm-fun-shuffle-arg-missing-param.tact rename to src/060-types/test-failed/asm-fun-shuffle-arg-missing-param.tact diff --git a/src/types/test-failed/asm-fun-shuffle-arg-non-existent-param.tact b/src/060-types/test-failed/asm-fun-shuffle-arg-non-existent-param.tact similarity index 100% rename from src/types/test-failed/asm-fun-shuffle-arg-non-existent-param.tact rename to src/060-types/test-failed/asm-fun-shuffle-arg-non-existent-param.tact diff --git a/src/types/test-failed/asm-fun-shuffle-ret-duplicate.tact b/src/060-types/test-failed/asm-fun-shuffle-ret-duplicate.tact similarity index 100% rename from src/types/test-failed/asm-fun-shuffle-ret-duplicate.tact rename to src/060-types/test-failed/asm-fun-shuffle-ret-duplicate.tact diff --git a/src/types/test-failed/asm-fun-shuffle-ret-missing-position.tact b/src/060-types/test-failed/asm-fun-shuffle-ret-missing-position.tact similarity index 100% rename from src/types/test-failed/asm-fun-shuffle-ret-missing-position.tact rename to src/060-types/test-failed/asm-fun-shuffle-ret-missing-position.tact diff --git a/src/types/test-failed/asm-fun-shuffle-ret-non-existent-position.tact b/src/060-types/test-failed/asm-fun-shuffle-ret-non-existent-position.tact similarity index 100% rename from src/types/test-failed/asm-fun-shuffle-ret-non-existent-position.tact rename to src/060-types/test-failed/asm-fun-shuffle-ret-non-existent-position.tact diff --git a/src/types/test-failed/const-decl-default-field-wrong-initializer-type copy.tact b/src/060-types/test-failed/const-decl-default-field-wrong-initializer-type copy.tact similarity index 100% rename from src/types/test-failed/const-decl-default-field-wrong-initializer-type copy.tact rename to src/060-types/test-failed/const-decl-default-field-wrong-initializer-type copy.tact diff --git a/src/types/test-failed/const-eval-overflow.tact b/src/060-types/test-failed/const-eval-overflow.tact similarity index 100% rename from src/types/test-failed/const-eval-overflow.tact rename to src/060-types/test-failed/const-eval-overflow.tact diff --git a/src/types/test-failed/contract-bounced-receiver-int.tact b/src/060-types/test-failed/contract-bounced-receiver-int.tact similarity index 100% rename from src/types/test-failed/contract-bounced-receiver-int.tact rename to src/060-types/test-failed/contract-bounced-receiver-int.tact diff --git a/src/types/test-failed/contract-bounced-receiver-missing-type-1.tact b/src/060-types/test-failed/contract-bounced-receiver-missing-type-1.tact similarity index 100% rename from src/types/test-failed/contract-bounced-receiver-missing-type-1.tact rename to src/060-types/test-failed/contract-bounced-receiver-missing-type-1.tact diff --git a/src/types/test-failed/contract-bounced-receiver-missing-type-2.tact b/src/060-types/test-failed/contract-bounced-receiver-missing-type-2.tact similarity index 100% rename from src/types/test-failed/contract-bounced-receiver-missing-type-2.tact rename to src/060-types/test-failed/contract-bounced-receiver-missing-type-2.tact diff --git a/src/types/test-failed/contract-bounced-storage-var.tact b/src/060-types/test-failed/contract-bounced-storage-var.tact similarity index 100% rename from src/types/test-failed/contract-bounced-storage-var.tact rename to src/060-types/test-failed/contract-bounced-storage-var.tact diff --git a/src/types/test-failed/contract-const-decl-default-field-wrong-initializer-type.tact b/src/060-types/test-failed/contract-const-decl-default-field-wrong-initializer-type.tact similarity index 100% rename from src/types/test-failed/contract-const-decl-default-field-wrong-initializer-type.tact rename to src/060-types/test-failed/contract-const-decl-default-field-wrong-initializer-type.tact diff --git a/src/types/test-failed/contract-const-override-virtual-no-keyword.tact b/src/060-types/test-failed/contract-const-override-virtual-no-keyword.tact similarity index 100% rename from src/types/test-failed/contract-const-override-virtual-no-keyword.tact rename to src/060-types/test-failed/contract-const-override-virtual-no-keyword.tact diff --git a/src/types/test-failed/contract-does-not-override-abstract-const.tact b/src/060-types/test-failed/contract-does-not-override-abstract-const.tact similarity index 100% rename from src/types/test-failed/contract-does-not-override-abstract-const.tact rename to src/060-types/test-failed/contract-does-not-override-abstract-const.tact diff --git a/src/types/test-failed/contract-does-not-override-abstract-getter.tact b/src/060-types/test-failed/contract-does-not-override-abstract-getter.tact similarity index 100% rename from src/types/test-failed/contract-does-not-override-abstract-getter.tact rename to src/060-types/test-failed/contract-does-not-override-abstract-getter.tact diff --git a/src/types/test-failed/contract-duplicate-bounced-fallback.tact b/src/060-types/test-failed/contract-duplicate-bounced-fallback.tact similarity index 100% rename from src/types/test-failed/contract-duplicate-bounced-fallback.tact rename to src/060-types/test-failed/contract-duplicate-bounced-fallback.tact diff --git a/src/types/test-failed/contract-duplicate-bounced1.tact b/src/060-types/test-failed/contract-duplicate-bounced1.tact similarity index 100% rename from src/types/test-failed/contract-duplicate-bounced1.tact rename to src/060-types/test-failed/contract-duplicate-bounced1.tact diff --git a/src/types/test-failed/contract-duplicate-bounced2.tact b/src/060-types/test-failed/contract-duplicate-bounced2.tact similarity index 100% rename from src/types/test-failed/contract-duplicate-bounced2.tact rename to src/060-types/test-failed/contract-duplicate-bounced2.tact diff --git a/src/types/test-failed/contract-duplicate-external-fallback.tact b/src/060-types/test-failed/contract-duplicate-external-fallback.tact similarity index 100% rename from src/types/test-failed/contract-duplicate-external-fallback.tact rename to src/060-types/test-failed/contract-duplicate-external-fallback.tact diff --git a/src/types/test-failed/contract-duplicate-external.tact b/src/060-types/test-failed/contract-duplicate-external.tact similarity index 100% rename from src/types/test-failed/contract-duplicate-external.tact rename to src/060-types/test-failed/contract-duplicate-external.tact diff --git a/src/types/test-failed/contract-duplicate-init.tact b/src/060-types/test-failed/contract-duplicate-init.tact similarity index 100% rename from src/types/test-failed/contract-duplicate-init.tact rename to src/060-types/test-failed/contract-duplicate-init.tact diff --git a/src/types/test-failed/contract-duplicate-receiver.tact b/src/060-types/test-failed/contract-duplicate-receiver.tact similarity index 100% rename from src/types/test-failed/contract-duplicate-receiver.tact rename to src/060-types/test-failed/contract-duplicate-receiver.tact diff --git a/src/types/test-failed/contract-duplicate-storage-var.tact b/src/060-types/test-failed/contract-duplicate-storage-var.tact similarity index 100% rename from src/types/test-failed/contract-duplicate-storage-var.tact rename to src/060-types/test-failed/contract-duplicate-storage-var.tact diff --git a/src/types/test-failed/contract-duplicates-in-trait-list.tact b/src/060-types/test-failed/contract-duplicates-in-trait-list.tact similarity index 100% rename from src/types/test-failed/contract-duplicates-in-trait-list.tact rename to src/060-types/test-failed/contract-duplicates-in-trait-list.tact diff --git a/src/types/test-failed/contract-getter-override-virtual-no-keyword.tact b/src/060-types/test-failed/contract-getter-override-virtual-no-keyword.tact similarity index 100% rename from src/types/test-failed/contract-getter-override-virtual-no-keyword.tact rename to src/060-types/test-failed/contract-getter-override-virtual-no-keyword.tact diff --git a/src/types/test-failed/contract-missing-type.tact b/src/060-types/test-failed/contract-missing-type.tact similarity index 100% rename from src/types/test-failed/contract-missing-type.tact rename to src/060-types/test-failed/contract-missing-type.tact diff --git a/src/types/test-failed/contract-receiver-int.tact b/src/060-types/test-failed/contract-receiver-int.tact similarity index 100% rename from src/types/test-failed/contract-receiver-int.tact rename to src/060-types/test-failed/contract-receiver-int.tact diff --git a/src/types/test-failed/contract-receiver-optional-msg.tact b/src/060-types/test-failed/contract-receiver-optional-msg.tact similarity index 100% rename from src/types/test-failed/contract-receiver-optional-msg.tact rename to src/060-types/test-failed/contract-receiver-optional-msg.tact diff --git a/src/types/test-failed/contract-receiver-struct.tact b/src/060-types/test-failed/contract-receiver-struct.tact similarity index 100% rename from src/types/test-failed/contract-receiver-struct.tact rename to src/060-types/test-failed/contract-receiver-struct.tact diff --git a/src/types/test-failed/expr-bitwise-not-bool-in-const1.tact b/src/060-types/test-failed/expr-bitwise-not-bool-in-const1.tact similarity index 100% rename from src/types/test-failed/expr-bitwise-not-bool-in-const1.tact rename to src/060-types/test-failed/expr-bitwise-not-bool-in-const1.tact diff --git a/src/types/test-failed/expr-bitwise-not-bool-in-const2.tact b/src/060-types/test-failed/expr-bitwise-not-bool-in-const2.tact similarity index 100% rename from src/types/test-failed/expr-bitwise-not-bool-in-const2.tact rename to src/060-types/test-failed/expr-bitwise-not-bool-in-const2.tact diff --git a/src/types/test-failed/getter-outside-contract.tact b/src/060-types/test-failed/getter-outside-contract.tact similarity index 100% rename from src/types/test-failed/getter-outside-contract.tact rename to src/060-types/test-failed/getter-outside-contract.tact diff --git a/src/types/test-failed/message-negative-opcode-1.tact b/src/060-types/test-failed/message-negative-opcode-1.tact similarity index 100% rename from src/types/test-failed/message-negative-opcode-1.tact rename to src/060-types/test-failed/message-negative-opcode-1.tact diff --git a/src/types/test-failed/message-negative-opcode-2.tact b/src/060-types/test-failed/message-negative-opcode-2.tact similarity index 100% rename from src/types/test-failed/message-negative-opcode-2.tact rename to src/060-types/test-failed/message-negative-opcode-2.tact diff --git a/src/types/test-failed/message-opcode-div-by-zero.tact b/src/060-types/test-failed/message-opcode-div-by-zero.tact similarity index 100% rename from src/types/test-failed/message-opcode-div-by-zero.tact rename to src/060-types/test-failed/message-opcode-div-by-zero.tact diff --git a/src/types/test-failed/message-opcode-too-large-1.tact b/src/060-types/test-failed/message-opcode-too-large-1.tact similarity index 100% rename from src/types/test-failed/message-opcode-too-large-1.tact rename to src/060-types/test-failed/message-opcode-too-large-1.tact diff --git a/src/types/test-failed/message-opcode-too-large-2.tact b/src/060-types/test-failed/message-opcode-too-large-2.tact similarity index 100% rename from src/types/test-failed/message-opcode-too-large-2.tact rename to src/060-types/test-failed/message-opcode-too-large-2.tact diff --git a/src/types/test-failed/message-opcode-zero-1.tact b/src/060-types/test-failed/message-opcode-zero-1.tact similarity index 100% rename from src/types/test-failed/message-opcode-zero-1.tact rename to src/060-types/test-failed/message-opcode-zero-1.tact diff --git a/src/types/test-failed/message-opcode-zero-2.tact b/src/060-types/test-failed/message-opcode-zero-2.tact similarity index 100% rename from src/types/test-failed/message-opcode-zero-2.tact rename to src/060-types/test-failed/message-opcode-zero-2.tact diff --git a/src/types/test-failed/method-first-param-not-self1.tact b/src/060-types/test-failed/method-first-param-not-self1.tact similarity index 100% rename from src/types/test-failed/method-first-param-not-self1.tact rename to src/060-types/test-failed/method-first-param-not-self1.tact diff --git a/src/types/test-failed/method-first-param-not-self2.tact b/src/060-types/test-failed/method-first-param-not-self2.tact similarity index 100% rename from src/types/test-failed/method-first-param-not-self2.tact rename to src/060-types/test-failed/method-first-param-not-self2.tact diff --git a/src/types/test-failed/native-fun-getter.tact b/src/060-types/test-failed/native-fun-getter.tact similarity index 100% rename from src/types/test-failed/native-fun-getter.tact rename to src/060-types/test-failed/native-fun-getter.tact diff --git a/src/types/test-failed/scope-contract-shadows-contract.tact b/src/060-types/test-failed/scope-contract-shadows-contract.tact similarity index 100% rename from src/types/test-failed/scope-contract-shadows-contract.tact rename to src/060-types/test-failed/scope-contract-shadows-contract.tact diff --git a/src/types/test-failed/scope-duplicate-method.tact b/src/060-types/test-failed/scope-duplicate-method.tact similarity index 100% rename from src/types/test-failed/scope-duplicate-method.tact rename to src/060-types/test-failed/scope-duplicate-method.tact diff --git a/src/types/test-failed/scope-fun-shadows-builtin-dumpStack.tact b/src/060-types/test-failed/scope-fun-shadows-builtin-dumpStack.tact similarity index 100% rename from src/types/test-failed/scope-fun-shadows-builtin-dumpStack.tact rename to src/060-types/test-failed/scope-fun-shadows-builtin-dumpStack.tact diff --git a/src/types/test-failed/scope-fun-shadows-builtin-ton.tact b/src/060-types/test-failed/scope-fun-shadows-builtin-ton.tact similarity index 100% rename from src/types/test-failed/scope-fun-shadows-builtin-ton.tact rename to src/060-types/test-failed/scope-fun-shadows-builtin-ton.tact diff --git a/src/types/test-failed/scope-fun-shadows-fun.tact b/src/060-types/test-failed/scope-fun-shadows-fun.tact similarity index 100% rename from src/types/test-failed/scope-fun-shadows-fun.tact rename to src/060-types/test-failed/scope-fun-shadows-fun.tact diff --git a/src/types/test-failed/scope-internal-fun-shadows-internal-fun.tact b/src/060-types/test-failed/scope-internal-fun-shadows-internal-fun.tact similarity index 100% rename from src/types/test-failed/scope-internal-fun-shadows-internal-fun.tact rename to src/060-types/test-failed/scope-internal-fun-shadows-internal-fun.tact diff --git a/src/types/test-failed/scope-param-shadows-param.tact b/src/060-types/test-failed/scope-param-shadows-param.tact similarity index 100% rename from src/types/test-failed/scope-param-shadows-param.tact rename to src/060-types/test-failed/scope-param-shadows-param.tact diff --git a/src/types/test-failed/scope-storage-var-shadows-trait-const.tact b/src/060-types/test-failed/scope-storage-var-shadows-trait-const.tact similarity index 100% rename from src/types/test-failed/scope-storage-var-shadows-trait-const.tact rename to src/060-types/test-failed/scope-storage-var-shadows-trait-const.tact diff --git a/src/types/test-failed/scope-struct-shadows-contract.tact b/src/060-types/test-failed/scope-struct-shadows-contract.tact similarity index 100% rename from src/types/test-failed/scope-struct-shadows-contract.tact rename to src/060-types/test-failed/scope-struct-shadows-contract.tact diff --git a/src/types/test-failed/scope-struct-shadows-struct.tact b/src/060-types/test-failed/scope-struct-shadows-struct.tact similarity index 100% rename from src/types/test-failed/scope-struct-shadows-struct.tact rename to src/060-types/test-failed/scope-struct-shadows-struct.tact diff --git a/src/types/test-failed/struct-decl-clash-with-int.tact b/src/060-types/test-failed/struct-decl-clash-with-int.tact similarity index 100% rename from src/types/test-failed/struct-decl-clash-with-int.tact rename to src/060-types/test-failed/struct-decl-clash-with-int.tact diff --git a/src/types/test-failed/struct-decl-default-field-wrong-initializer-type.tact b/src/060-types/test-failed/struct-decl-default-field-wrong-initializer-type.tact similarity index 100% rename from src/types/test-failed/struct-decl-default-field-wrong-initializer-type.tact rename to src/060-types/test-failed/struct-decl-default-field-wrong-initializer-type.tact diff --git a/src/types/test-failed/struct-decl-duplicate-decl.tact b/src/060-types/test-failed/struct-decl-duplicate-decl.tact similarity index 100% rename from src/types/test-failed/struct-decl-duplicate-decl.tact rename to src/060-types/test-failed/struct-decl-duplicate-decl.tact diff --git a/src/types/test-failed/struct-decl-duplicate-field.tact b/src/060-types/test-failed/struct-decl-duplicate-field.tact similarity index 100% rename from src/types/test-failed/struct-decl-duplicate-field.tact rename to src/060-types/test-failed/struct-decl-duplicate-field.tact diff --git a/src/types/test-failed/struct-decl-empty-not-allowed.tact b/src/060-types/test-failed/struct-decl-empty-not-allowed.tact similarity index 100% rename from src/types/test-failed/struct-decl-empty-not-allowed.tact rename to src/060-types/test-failed/struct-decl-empty-not-allowed.tact diff --git a/src/types/test-failed/struct-decl-mutually-recursive.tact b/src/060-types/test-failed/struct-decl-mutually-recursive.tact similarity index 100% rename from src/types/test-failed/struct-decl-mutually-recursive.tact rename to src/060-types/test-failed/struct-decl-mutually-recursive.tact diff --git a/src/types/test-failed/struct-decl-remainder-in-the-middle.tact b/src/060-types/test-failed/struct-decl-remainder-in-the-middle.tact similarity index 100% rename from src/types/test-failed/struct-decl-remainder-in-the-middle.tact rename to src/060-types/test-failed/struct-decl-remainder-in-the-middle.tact diff --git a/src/types/test-failed/struct-decl-self-reference-map.tact b/src/060-types/test-failed/struct-decl-self-reference-map.tact similarity index 100% rename from src/types/test-failed/struct-decl-self-reference-map.tact rename to src/060-types/test-failed/struct-decl-self-reference-map.tact diff --git a/src/types/test-failed/struct-decl-self-reference.tact b/src/060-types/test-failed/struct-decl-self-reference.tact similarity index 100% rename from src/types/test-failed/struct-decl-self-reference.tact rename to src/060-types/test-failed/struct-decl-self-reference.tact diff --git a/src/types/test-failed/trait-duplicates-in-trait-list.tact b/src/060-types/test-failed/trait-duplicates-in-trait-list.tact similarity index 100% rename from src/types/test-failed/trait-duplicates-in-trait-list.tact rename to src/060-types/test-failed/trait-duplicates-in-trait-list.tact diff --git a/src/types/test-failed/trait-field-initialized.tact b/src/060-types/test-failed/trait-field-initialized.tact similarity index 100% rename from src/types/test-failed/trait-field-initialized.tact rename to src/060-types/test-failed/trait-field-initialized.tact diff --git a/src/types/test-failed/wf-type-const.tact b/src/060-types/test-failed/wf-type-const.tact similarity index 100% rename from src/types/test-failed/wf-type-const.tact rename to src/060-types/test-failed/wf-type-const.tact diff --git a/src/types/test-failed/wf-type-contract-const-incorrect-annotation.tact b/src/060-types/test-failed/wf-type-contract-const-incorrect-annotation.tact similarity index 100% rename from src/types/test-failed/wf-type-contract-const-incorrect-annotation.tact rename to src/060-types/test-failed/wf-type-contract-const-incorrect-annotation.tact diff --git a/src/types/test-failed/wf-type-contract-const.tact b/src/060-types/test-failed/wf-type-contract-const.tact similarity index 100% rename from src/types/test-failed/wf-type-contract-const.tact rename to src/060-types/test-failed/wf-type-contract-const.tact diff --git a/src/types/test-failed/wf-type-contract-getter.tact b/src/060-types/test-failed/wf-type-contract-getter.tact similarity index 100% rename from src/types/test-failed/wf-type-contract-getter.tact rename to src/060-types/test-failed/wf-type-contract-getter.tact diff --git a/src/types/test-failed/wf-type-contract-incorrect-map-key-annotation-coins.tact b/src/060-types/test-failed/wf-type-contract-incorrect-map-key-annotation-coins.tact similarity index 100% rename from src/types/test-failed/wf-type-contract-incorrect-map-key-annotation-coins.tact rename to src/060-types/test-failed/wf-type-contract-incorrect-map-key-annotation-coins.tact diff --git a/src/types/test-failed/wf-type-contract-incorrect-map-key-annotation-varint16.tact b/src/060-types/test-failed/wf-type-contract-incorrect-map-key-annotation-varint16.tact similarity index 100% rename from src/types/test-failed/wf-type-contract-incorrect-map-key-annotation-varint16.tact rename to src/060-types/test-failed/wf-type-contract-incorrect-map-key-annotation-varint16.tact diff --git a/src/types/test-failed/wf-type-contract-incorrect-map-key-annotation-varint32.tact b/src/060-types/test-failed/wf-type-contract-incorrect-map-key-annotation-varint32.tact similarity index 100% rename from src/types/test-failed/wf-type-contract-incorrect-map-key-annotation-varint32.tact rename to src/060-types/test-failed/wf-type-contract-incorrect-map-key-annotation-varint32.tact diff --git a/src/types/test-failed/wf-type-contract-incorrect-map-key-annotation-varuint16.tact b/src/060-types/test-failed/wf-type-contract-incorrect-map-key-annotation-varuint16.tact similarity index 100% rename from src/types/test-failed/wf-type-contract-incorrect-map-key-annotation-varuint16.tact rename to src/060-types/test-failed/wf-type-contract-incorrect-map-key-annotation-varuint16.tact diff --git a/src/types/test-failed/wf-type-contract-incorrect-map-key-annotation-varuint32.tact b/src/060-types/test-failed/wf-type-contract-incorrect-map-key-annotation-varuint32.tact similarity index 100% rename from src/types/test-failed/wf-type-contract-incorrect-map-key-annotation-varuint32.tact rename to src/060-types/test-failed/wf-type-contract-incorrect-map-key-annotation-varuint32.tact diff --git a/src/types/test-failed/wf-type-fun-param.tact b/src/060-types/test-failed/wf-type-fun-param.tact similarity index 100% rename from src/types/test-failed/wf-type-fun-param.tact rename to src/060-types/test-failed/wf-type-fun-param.tact diff --git a/src/types/test/asm-extends-fun.tact b/src/060-types/test/asm-extends-fun.tact similarity index 100% rename from src/types/test/asm-extends-fun.tact rename to src/060-types/test/asm-extends-fun.tact diff --git a/src/types/test/asm-fun-no-arg-shuffle.tact b/src/060-types/test/asm-fun-no-arg-shuffle.tact similarity index 100% rename from src/types/test/asm-fun-no-arg-shuffle.tact rename to src/060-types/test/asm-fun-no-arg-shuffle.tact diff --git a/src/types/test/asm-fun-no-ret-shuffle.tact b/src/060-types/test/asm-fun-no-ret-shuffle.tact similarity index 100% rename from src/types/test/asm-fun-no-ret-shuffle.tact rename to src/060-types/test/asm-fun-no-ret-shuffle.tact diff --git a/src/types/test/asm-fun-no-shuffle.tact b/src/060-types/test/asm-fun-no-shuffle.tact similarity index 100% rename from src/types/test/asm-fun-no-shuffle.tact rename to src/060-types/test/asm-fun-no-shuffle.tact diff --git a/src/types/test/asm-fun-shuffle-pair.tact b/src/060-types/test/asm-fun-shuffle-pair.tact similarity index 100% rename from src/types/test/asm-fun-shuffle-pair.tact rename to src/060-types/test/asm-fun-shuffle-pair.tact diff --git a/src/types/test/const-decl-struct-with-default-field.tact b/src/060-types/test/const-decl-struct-with-default-field.tact similarity index 100% rename from src/types/test/const-decl-struct-with-default-field.tact rename to src/060-types/test/const-decl-struct-with-default-field.tact diff --git a/src/types/test/const-decl-struct-with-optional-field.tact b/src/060-types/test/const-decl-struct-with-optional-field.tact similarity index 100% rename from src/types/test/const-decl-struct-with-optional-field.tact rename to src/060-types/test/const-decl-struct-with-optional-field.tact diff --git a/src/types/test/contract-bounced-slice.tact b/src/060-types/test/contract-bounced-slice.tact similarity index 100% rename from src/types/test/contract-bounced-slice.tact rename to src/060-types/test/contract-bounced-slice.tact diff --git a/src/types/test/contract-bounced-too-small-not-detected.tact b/src/060-types/test/contract-bounced-too-small-not-detected.tact similarity index 100% rename from src/types/test/contract-bounced-too-small-not-detected.tact rename to src/060-types/test/contract-bounced-too-small-not-detected.tact diff --git a/src/types/test/contract-const-override-abstract.tact b/src/060-types/test/contract-const-override-abstract.tact similarity index 100% rename from src/types/test/contract-const-override-abstract.tact rename to src/060-types/test/contract-const-override-abstract.tact diff --git a/src/types/test/contract-const-override-virtual.tact b/src/060-types/test/contract-const-override-virtual.tact similarity index 100% rename from src/types/test/contract-const-override-virtual.tact rename to src/060-types/test/contract-const-override-virtual.tact diff --git a/src/types/test/contract-external-fallback-receiver.tact b/src/060-types/test/contract-external-fallback-receiver.tact similarity index 100% rename from src/types/test/contract-external-fallback-receiver.tact rename to src/060-types/test/contract-external-fallback-receiver.tact diff --git a/src/types/test/contract-getter-override-abstract.tact b/src/060-types/test/contract-getter-override-abstract.tact similarity index 100% rename from src/types/test/contract-getter-override-abstract.tact rename to src/060-types/test/contract-getter-override-abstract.tact diff --git a/src/types/test/contract-getter-override-virtual.tact b/src/060-types/test/contract-getter-override-virtual.tact similarity index 100% rename from src/types/test/contract-getter-override-virtual.tact rename to src/060-types/test/contract-getter-override-virtual.tact diff --git a/src/types/test/fun-extends-opt-self.tact b/src/060-types/test/fun-extends-opt-self.tact similarity index 100% rename from src/types/test/fun-extends-opt-self.tact rename to src/060-types/test/fun-extends-opt-self.tact diff --git a/src/types/test/init-vars-analysis-uninit-storage-vars.tact b/src/060-types/test/init-vars-analysis-uninit-storage-vars.tact similarity index 100% rename from src/types/test/init-vars-analysis-uninit-storage-vars.tact rename to src/060-types/test/init-vars-analysis-uninit-storage-vars.tact diff --git a/src/types/test/item-funs-with-errors-in-bodies1.tact b/src/060-types/test/item-funs-with-errors-in-bodies1.tact similarity index 100% rename from src/types/test/item-funs-with-errors-in-bodies1.tact rename to src/060-types/test/item-funs-with-errors-in-bodies1.tact diff --git a/src/types/test/item-funs-with-errors-in-bodies2.tact b/src/060-types/test/item-funs-with-errors-in-bodies2.tact similarity index 100% rename from src/types/test/item-funs-with-errors-in-bodies2.tact rename to src/060-types/test/item-funs-with-errors-in-bodies2.tact diff --git a/src/types/test/item-method.tact b/src/060-types/test/item-method.tact similarity index 100% rename from src/types/test/item-method.tact rename to src/060-types/test/item-method.tact diff --git a/src/types/test/item-native-decl.tact b/src/060-types/test/item-native-decl.tact similarity index 100% rename from src/types/test/item-native-decl.tact rename to src/060-types/test/item-native-decl.tact diff --git a/src/types/test/item-native-mutating-method.tact b/src/060-types/test/item-native-mutating-method.tact similarity index 100% rename from src/types/test/item-native-mutating-method.tact rename to src/060-types/test/item-native-mutating-method.tact diff --git a/src/types/test/map-value-as-coins.tact b/src/060-types/test/map-value-as-coins.tact similarity index 100% rename from src/types/test/map-value-as-coins.tact rename to src/060-types/test/map-value-as-coins.tact diff --git a/src/types/test/map-value-as-varint.tact b/src/060-types/test/map-value-as-varint.tact similarity index 100% rename from src/types/test/map-value-as-varint.tact rename to src/060-types/test/map-value-as-varint.tact diff --git a/src/types/test/map-value-as-varuint.tact b/src/060-types/test/map-value-as-varuint.tact similarity index 100% rename from src/types/test/map-value-as-varuint.tact rename to src/060-types/test/map-value-as-varuint.tact diff --git a/src/types/test/message-opcode-expr.tact b/src/060-types/test/message-opcode-expr.tact similarity index 100% rename from src/types/test/message-opcode-expr.tact rename to src/060-types/test/message-opcode-expr.tact diff --git a/src/types/test/scope-loops.tact b/src/060-types/test/scope-loops.tact similarity index 100% rename from src/types/test/scope-loops.tact rename to src/060-types/test/scope-loops.tact diff --git a/src/types/test/struct-decl-default-field.tact b/src/060-types/test/struct-decl-default-field.tact similarity index 100% rename from src/types/test/struct-decl-default-field.tact rename to src/060-types/test/struct-decl-default-field.tact diff --git a/src/types/test/struct-decl-nested.tact b/src/060-types/test/struct-decl-nested.tact similarity index 100% rename from src/types/test/struct-decl-nested.tact rename to src/060-types/test/struct-decl-nested.tact diff --git a/src/types/test/struct-decl-non-rec-types.tact b/src/060-types/test/struct-decl-non-rec-types.tact similarity index 100% rename from src/types/test/struct-decl-non-rec-types.tact rename to src/060-types/test/struct-decl-non-rec-types.tact diff --git a/src/types/test/struct-decl-remainder.tact b/src/060-types/test/struct-decl-remainder.tact similarity index 100% rename from src/types/test/struct-decl-remainder.tact rename to src/060-types/test/struct-decl-remainder.tact diff --git a/src/types/test/trait-base.tact b/src/060-types/test/trait-base.tact similarity index 100% rename from src/types/test/trait-base.tact rename to src/060-types/test/trait-base.tact diff --git a/src/types/test/trait-foreach.tact b/src/060-types/test/trait-foreach.tact similarity index 100% rename from src/types/test/trait-foreach.tact rename to src/060-types/test/trait-foreach.tact diff --git a/src/types/types.ts b/src/060-types/types.ts similarity index 100% rename from src/types/types.ts rename to src/060-types/types.ts diff --git a/src/abi/AbiFunction.ts b/src/abi/AbiFunction.ts index d25e24b21..548646c47 100644 --- a/src/abi/AbiFunction.ts +++ b/src/abi/AbiFunction.ts @@ -1,7 +1,7 @@ import { AstExpression } from "../050-grammar/ast"; import { CompilerContext } from "../010-pipeline/context"; import { WriterContext } from "../generator/Writer"; -import { TypeRef } from "../types/types"; +import { TypeRef } from "../060-types/types"; import { SrcInfo } from "../050-grammar"; export type AbiFunction = { diff --git a/src/abi/global.ts b/src/abi/global.ts index 100594f2e..328a6702c 100644 --- a/src/abi/global.ts +++ b/src/abi/global.ts @@ -11,7 +11,7 @@ import { } from "../generator/writers/writeExpression"; import { TactConstEvalError, throwCompilationError } from "../030-error/errors"; import { evalConstantExpression } from "../interpreter/constEval"; -import { getErrorId } from "../types/resolveErrors"; +import { getErrorId } from "../060-types/resolveErrors"; import { AbiFunction } from "./AbiFunction"; import { sha256_sync } from "@ton/crypto"; import path from "path"; diff --git a/src/abi/map.ts b/src/abi/map.ts index 7fa83cfaf..5066b96ad 100644 --- a/src/abi/map.ts +++ b/src/abi/map.ts @@ -1,11 +1,11 @@ import { CompilerContext } from "../010-pipeline/context"; import { SrcInfo } from "../050-grammar"; -import { TypeRef } from "../types/types"; +import { TypeRef } from "../060-types/types"; import { WriterContext } from "../generator/Writer"; import { ops } from "../generator/writers/ops"; import { writeExpression } from "../generator/writers/writeExpression"; import { throwCompilationError } from "../030-error/errors"; -import { getType } from "../types/resolveDescriptors"; +import { getType } from "../060-types/resolveDescriptors"; import { AbiFunction } from "./AbiFunction"; import { AstExpression } from "../050-grammar/ast"; diff --git a/src/abi/struct.ts b/src/abi/struct.ts index 39569793f..297183687 100644 --- a/src/abi/struct.ts +++ b/src/abi/struct.ts @@ -1,7 +1,7 @@ import { ops } from "../generator/writers/ops"; import { writeExpression } from "../generator/writers/writeExpression"; import { throwCompilationError } from "../030-error/errors"; -import { getType } from "../types/resolveDescriptors"; +import { getType } from "../060-types/resolveDescriptors"; import { AbiFunction } from "./AbiFunction"; export const StructFunctions: Map = new Map([ diff --git a/src/bindings/typescript/writeStruct.ts b/src/bindings/typescript/writeStruct.ts index 0f5945632..e50d4ce30 100644 --- a/src/bindings/typescript/writeStruct.ts +++ b/src/bindings/typescript/writeStruct.ts @@ -1,6 +1,6 @@ import { ABIType, ABITypeRef } from "@ton/core"; import { serializers } from "./serializers"; -import { AllocationCell, AllocationOperation } from "../../storage/operation"; +import { AllocationCell, AllocationOperation } from "../../060-types/operation"; import { throwInternalCompilerError } from "../../030-error/errors"; import { Writer } from "../../utils/Writer"; diff --git a/src/bindings/writeTypescript.ts b/src/bindings/writeTypescript.ts index 584a66df2..4d11e2e94 100644 --- a/src/bindings/writeTypescript.ts +++ b/src/bindings/writeTypescript.ts @@ -13,13 +13,13 @@ import { writeTupleParser, writeTupleSerializer, } from "./typescript/writeStruct"; -import { AllocationCell } from "../storage/operation"; +import { AllocationCell } from "../060-types/operation"; import { throwInternalCompilerError } from "../030-error/errors"; import { topologicalSort } from "../utils/utils"; import { allocate, getAllocationOperationFromField, -} from "../storage/allocator"; +} from "../060-types/allocator"; import { serializers } from "./typescript/serializers"; import { eqNames } from "../050-grammar/ast"; diff --git a/src/generator/createABI.ts b/src/generator/createABI.ts index c874ec31e..31218140d 100644 --- a/src/generator/createABI.ts +++ b/src/generator/createABI.ts @@ -2,10 +2,10 @@ import { ABIGetter, ABIReceiver, ABIType, ContractABI } from "@ton/core"; import { contractErrors } from "../abi/errors"; import { CompilerContext } from "../010-pipeline/context"; import { idText } from "../050-grammar/ast"; -import { getSupportedInterfaces } from "../types/getSupportedInterfaces"; -import { createABITypeRefFromTypeRef } from "../types/resolveABITypeRef"; -import { getAllTypes } from "../types/resolveDescriptors"; -import { getAllErrors } from "../types/resolveErrors"; +import { getSupportedInterfaces } from "../060-types/getSupportedInterfaces"; +import { createABITypeRefFromTypeRef } from "../060-types/resolveABITypeRef"; +import { getAllTypes } from "../060-types/resolveDescriptors"; +import { getAllErrors } from "../060-types/resolveErrors"; export function createABI(ctx: CompilerContext, name: string): ContractABI { const allTypes = getAllTypes(ctx); diff --git a/src/generator/writeProgram.ts b/src/generator/writeProgram.ts index d17b4dbef..872c5b1a7 100644 --- a/src/generator/writeProgram.ts +++ b/src/generator/writeProgram.ts @@ -1,10 +1,10 @@ import { CompilerContext } from "../010-pipeline/context"; -import { getAllocation, getSortedTypes } from "../storage/resolveAllocation"; +import { getAllocation, getSortedTypes } from "../060-types/resolveAllocation"; import { getAllStaticFunctions, getAllTypes, toBounced, -} from "../types/resolveDescriptors"; +} from "../060-types/resolveDescriptors"; import { WriterContext, WrittenFunction } from "./Writer"; import { writeBouncedParser, diff --git a/src/generator/writeReport.ts b/src/generator/writeReport.ts index be67d5c52..155882dcc 100644 --- a/src/generator/writeReport.ts +++ b/src/generator/writeReport.ts @@ -1,9 +1,9 @@ import { ContractABI } from "@ton/core"; import { CompilerContext } from "../010-pipeline/context"; import { PackageFileFormat } from "../packaging/fileFormat"; -import { getType } from "../types/resolveDescriptors"; +import { getType } from "../060-types/resolveDescriptors"; import { Writer } from "../utils/Writer"; -import { TypeDescription } from "../types/types"; +import { TypeDescription } from "../060-types/types"; export function writeReport(ctx: CompilerContext, pkg: PackageFileFormat) { const w = new Writer(); diff --git a/src/generator/writers/cast.ts b/src/generator/writers/cast.ts index 4c098e455..8f7c3cee3 100644 --- a/src/generator/writers/cast.ts +++ b/src/generator/writers/cast.ts @@ -1,5 +1,5 @@ -import { getType } from "../../types/resolveDescriptors"; -import { TypeRef } from "../../types/types"; +import { getType } from "../../060-types/resolveDescriptors"; +import { TypeRef } from "../../060-types/types"; import { WriterContext } from "../Writer"; import { ops } from "./ops"; diff --git a/src/generator/writers/resolveFuncFlatPack.ts b/src/generator/writers/resolveFuncFlatPack.ts index f0480bc5a..3c37859b5 100644 --- a/src/generator/writers/resolveFuncFlatPack.ts +++ b/src/generator/writers/resolveFuncFlatPack.ts @@ -1,5 +1,5 @@ -import { getType } from "../../types/resolveDescriptors"; -import { TypeDescription, TypeRef } from "../../types/types"; +import { getType } from "../../060-types/resolveDescriptors"; +import { TypeDescription, TypeRef } from "../../060-types/types"; import { WriterContext } from "../Writer"; export function resolveFuncFlatPack( diff --git a/src/generator/writers/resolveFuncFlatTypes.ts b/src/generator/writers/resolveFuncFlatTypes.ts index 2f829a2ba..d7fc33d66 100644 --- a/src/generator/writers/resolveFuncFlatTypes.ts +++ b/src/generator/writers/resolveFuncFlatTypes.ts @@ -1,5 +1,5 @@ -import { getType } from "../../types/resolveDescriptors"; -import { TypeDescription, TypeRef } from "../../types/types"; +import { getType } from "../../060-types/resolveDescriptors"; +import { TypeDescription, TypeRef } from "../../060-types/types"; import { WriterContext } from "../Writer"; import { resolveFuncType } from "./resolveFuncType"; diff --git a/src/generator/writers/resolveFuncPrimitive.ts b/src/generator/writers/resolveFuncPrimitive.ts index 0d815f358..490d24efb 100644 --- a/src/generator/writers/resolveFuncPrimitive.ts +++ b/src/generator/writers/resolveFuncPrimitive.ts @@ -1,5 +1,5 @@ -import { getType } from "../../types/resolveDescriptors"; -import { TypeDescription, TypeRef } from "../../types/types"; +import { getType } from "../../060-types/resolveDescriptors"; +import { TypeDescription, TypeRef } from "../../060-types/types"; import { WriterContext } from "../Writer"; export function resolveFuncPrimitive( diff --git a/src/generator/writers/resolveFuncTupleType.ts b/src/generator/writers/resolveFuncTupleType.ts index 70483cebc..c0f0550ba 100644 --- a/src/generator/writers/resolveFuncTupleType.ts +++ b/src/generator/writers/resolveFuncTupleType.ts @@ -1,5 +1,5 @@ -import { getType } from "../../types/resolveDescriptors"; -import { TypeDescription, TypeRef } from "../../types/types"; +import { getType } from "../../060-types/resolveDescriptors"; +import { TypeDescription, TypeRef } from "../../060-types/types"; import { WriterContext } from "../Writer"; export function resolveFuncTupleType( diff --git a/src/generator/writers/resolveFuncType.spec.ts b/src/generator/writers/resolveFuncType.spec.ts index a40cd9194..f9325ae77 100644 --- a/src/generator/writers/resolveFuncType.spec.ts +++ b/src/generator/writers/resolveFuncType.spec.ts @@ -1,5 +1,5 @@ import { getAstFactory } from "../../050-grammar/ast"; -import { resolveDescriptors } from "../../types/resolveDescriptors"; +import { resolveDescriptors } from "../../060-types/resolveDescriptors"; import { WriterContext } from "../Writer"; import { resolveFuncType } from "./resolveFuncType"; import { openContext } from "../../050-grammar/store"; diff --git a/src/generator/writers/resolveFuncType.ts b/src/generator/writers/resolveFuncType.ts index a5b920636..365696752 100644 --- a/src/generator/writers/resolveFuncType.ts +++ b/src/generator/writers/resolveFuncType.ts @@ -1,5 +1,5 @@ -import { getType } from "../../types/resolveDescriptors"; -import { TypeDescription, TypeRef } from "../../types/types"; +import { getType } from "../../060-types/resolveDescriptors"; +import { TypeDescription, TypeRef } from "../../060-types/types"; import { WriterContext } from "../Writer"; export function resolveFuncType( diff --git a/src/generator/writers/resolveFuncTypeFromAbi.ts b/src/generator/writers/resolveFuncTypeFromAbi.ts index c45b7b5da..24b5c1347 100644 --- a/src/generator/writers/resolveFuncTypeFromAbi.ts +++ b/src/generator/writers/resolveFuncTypeFromAbi.ts @@ -1,5 +1,5 @@ import { ABITypeRef } from "@ton/core"; -import { getType } from "../../types/resolveDescriptors"; +import { getType } from "../../060-types/resolveDescriptors"; import { WriterContext } from "../Writer"; export function resolveFuncTypeFromAbi( diff --git a/src/generator/writers/resolveFuncTypeFromAbiUnpack.ts b/src/generator/writers/resolveFuncTypeFromAbiUnpack.ts index 4652570d7..2654dcc93 100644 --- a/src/generator/writers/resolveFuncTypeFromAbiUnpack.ts +++ b/src/generator/writers/resolveFuncTypeFromAbiUnpack.ts @@ -1,5 +1,5 @@ import { ABITypeRef } from "@ton/core"; -import { getType } from "../../types/resolveDescriptors"; +import { getType } from "../../060-types/resolveDescriptors"; import { WriterContext } from "../Writer"; export function resolveFuncTypeFromAbiUnpack( diff --git a/src/generator/writers/resolveFuncTypeUnpack.ts b/src/generator/writers/resolveFuncTypeUnpack.ts index dd088d8b0..c9c731506 100644 --- a/src/generator/writers/resolveFuncTypeUnpack.ts +++ b/src/generator/writers/resolveFuncTypeUnpack.ts @@ -1,5 +1,5 @@ -import { getType } from "../../types/resolveDescriptors"; -import { TypeDescription, TypeRef } from "../../types/types"; +import { getType } from "../../060-types/resolveDescriptors"; +import { TypeDescription, TypeRef } from "../../060-types/types"; import { WriterContext } from "../Writer"; export function resolveFuncTypeUnpack( diff --git a/src/generator/writers/writeAccessors.ts b/src/generator/writers/writeAccessors.ts index e2f4f3260..2b63f8d53 100644 --- a/src/generator/writers/writeAccessors.ts +++ b/src/generator/writers/writeAccessors.ts @@ -1,8 +1,8 @@ import { contractErrors } from "../../abi/errors"; import { maxTupleSize } from "../../bindings/typescript/writeStruct"; import { ItemOrigin } from "../../050-grammar"; -import { getType } from "../../types/resolveDescriptors"; -import { TypeDescription } from "../../types/types"; +import { getType } from "../../060-types/resolveDescriptors"; +import { TypeDescription } from "../../060-types/types"; import { WriterContext } from "../Writer"; import { ops } from "./ops"; import { resolveFuncFlatPack } from "./resolveFuncFlatPack"; diff --git a/src/generator/writers/writeContract.ts b/src/generator/writers/writeContract.ts index 14867da2c..d1d80abe7 100644 --- a/src/generator/writers/writeContract.ts +++ b/src/generator/writers/writeContract.ts @@ -5,7 +5,7 @@ import { enabledIpfsAbiGetter, } from "../../000-config/features"; import { ItemOrigin } from "../../050-grammar"; -import { InitDescription, TypeDescription } from "../../types/types"; +import { InitDescription, TypeDescription } from "../../060-types/types"; import { WriterContext } from "../Writer"; import { funcIdOf, funcInitIdOf } from "./id"; import { ops } from "./ops"; diff --git a/src/generator/writers/writeExpression.spec.ts b/src/generator/writers/writeExpression.spec.ts index 3e944e2e9..e8dd82e44 100644 --- a/src/generator/writers/writeExpression.spec.ts +++ b/src/generator/writers/writeExpression.spec.ts @@ -1,11 +1,11 @@ import { getStaticFunction, resolveDescriptors, -} from "../../types/resolveDescriptors"; +} from "../../060-types/resolveDescriptors"; import { WriterContext } from "../Writer"; import { writeExpression } from "./writeExpression"; import { openContext } from "../../050-grammar/store"; -import { resolveStatements } from "../../types/resolveStatements"; +import { resolveStatements } from "../../060-types/resolveStatements"; import { CompilerContext } from "../../010-pipeline/context"; import { getParser } from "../../050-grammar"; import { getAstFactory } from "../../050-grammar/ast"; diff --git a/src/generator/writers/writeExpression.ts b/src/generator/writers/writeExpression.ts index 08512b8b3..516a58c5d 100644 --- a/src/generator/writers/writeExpression.ts +++ b/src/generator/writers/writeExpression.ts @@ -10,20 +10,20 @@ import { TactConstEvalError, throwCompilationError, } from "../../030-error/errors"; -import { getExpType } from "../../types/resolveExpression"; +import { getExpType } from "../../060-types/resolveExpression"; import { getStaticConstant, getStaticFunction, getType, hasStaticConstant, -} from "../../types/resolveDescriptors"; +} from "../../060-types/resolveDescriptors"; import { FieldDescription, printTypeRef, TypeDescription, CommentValue, Value, -} from "../../types/types"; +} from "../../060-types/types"; import { WriterContext } from "../Writer"; import { resolveFuncTypeUnpack } from "./resolveFuncTypeUnpack"; import { MapFunctions } from "../../abi/map"; @@ -42,7 +42,7 @@ import { import { ops } from "./ops"; import { writeCastedExpression } from "./writeFunction"; import { evalConstantExpression } from "../../interpreter/constEval"; -import { isLvalue } from "../../types/resolveStatements"; +import { isLvalue } from "../../060-types/resolveStatements"; function isNull(wCtx: WriterContext, expr: AstExpression): boolean { return getExpType(wCtx.ctx, expr).kind === "null"; diff --git a/src/generator/writers/writeFunction.ts b/src/generator/writers/writeFunction.ts index 0083d92b1..496808610 100644 --- a/src/generator/writers/writeFunction.ts +++ b/src/generator/writers/writeFunction.ts @@ -9,9 +9,9 @@ import { isWildcard, tryExtractPath, } from "../../050-grammar/ast"; -import { getType, resolveTypeRef } from "../../types/resolveDescriptors"; -import { getExpType } from "../../types/resolveExpression"; -import { FunctionDescription, TypeRef } from "../../types/types"; +import { getType, resolveTypeRef } from "../../060-types/resolveDescriptors"; +import { getExpType } from "../../060-types/resolveExpression"; +import { FunctionDescription, TypeRef } from "../../060-types/types"; import { WriterContext } from "../Writer"; import { resolveFuncPrimitive } from "./resolveFuncPrimitive"; import { resolveFuncType } from "./resolveFuncType"; diff --git a/src/generator/writers/writeInterfaces.ts b/src/generator/writers/writeInterfaces.ts index 5173461ae..8c23cc4f7 100644 --- a/src/generator/writers/writeInterfaces.ts +++ b/src/generator/writers/writeInterfaces.ts @@ -1,5 +1,5 @@ -import { getSupportedInterfaces } from "../../types/getSupportedInterfaces"; -import { TypeDescription } from "../../types/types"; +import { getSupportedInterfaces } from "../../060-types/getSupportedInterfaces"; +import { TypeDescription } from "../../060-types/types"; import { WriterContext } from "../Writer"; export function writeInterfaces(type: TypeDescription, ctx: WriterContext) { diff --git a/src/generator/writers/writeRouter.ts b/src/generator/writers/writeRouter.ts index 5db8747c2..f5683acc5 100644 --- a/src/generator/writers/writeRouter.ts +++ b/src/generator/writers/writeRouter.ts @@ -1,6 +1,6 @@ import { beginCell } from "@ton/core"; -import { getType } from "../../types/resolveDescriptors"; -import { ReceiverDescription, TypeDescription } from "../../types/types"; +import { getType } from "../../060-types/resolveDescriptors"; +import { ReceiverDescription, TypeDescription } from "../../060-types/types"; import { WriterContext } from "../Writer"; import { funcIdOf } from "./id"; import { ops } from "./ops"; diff --git a/src/generator/writers/writeSerialization.spec.ts b/src/generator/writers/writeSerialization.spec.ts index de6695c00..59913ae98 100644 --- a/src/generator/writers/writeSerialization.spec.ts +++ b/src/generator/writers/writeSerialization.spec.ts @@ -2,12 +2,12 @@ import { CompilerContext } from "../../010-pipeline/context"; import { getAllocation, resolveAllocations, -} from "../../storage/resolveAllocation"; +} from "../../060-types/resolveAllocation"; import { getAllTypes, getType, resolveDescriptors, -} from "../../types/resolveDescriptors"; +} from "../../060-types/resolveDescriptors"; import { WriterContext } from "../Writer"; import { writeParser, writeSerializer } from "./writeSerialization"; import { writeStdlib } from "./writeStdlib"; diff --git a/src/generator/writers/writeSerialization.ts b/src/generator/writers/writeSerialization.ts index 810047cd7..ae0ef2ba6 100644 --- a/src/generator/writers/writeSerialization.ts +++ b/src/generator/writers/writeSerialization.ts @@ -1,9 +1,9 @@ import { contractErrors } from "../../abi/errors"; import { throwInternalCompilerError } from "../../030-error/errors"; import { dummySrcInfo, ItemOrigin } from "../../050-grammar"; -import { AllocationCell, AllocationOperation } from "../../storage/operation"; -import { StorageAllocation } from "../../storage/StorageAllocation"; -import { getType } from "../../types/resolveDescriptors"; +import { AllocationCell, AllocationOperation } from "../../060-types/operation"; +import { StorageAllocation } from "../../060-types/StorageAllocation"; +import { getType } from "../../060-types/resolveDescriptors"; import { WriterContext } from "../Writer"; import { ops } from "./ops"; import { resolveFuncTypeFromAbi } from "./resolveFuncTypeFromAbi"; diff --git a/src/interpreter/constEval.ts b/src/interpreter/constEval.ts index f2e49d56f..5109d19b9 100644 --- a/src/interpreter/constEval.ts +++ b/src/interpreter/constEval.ts @@ -7,7 +7,7 @@ import { isValue, } from "../050-grammar/ast"; import { TactConstEvalError } from "../030-error/errors"; -import { Value } from "../types/types"; +import { Value } from "../060-types/types"; import { AstUtil, extractValue } from "../optimizer/util"; import { ExpressionTransformer } from "../optimizer/types"; import { StandardOptimizer } from "../optimizer/standardOptimizer"; diff --git a/src/interpreter/interpreter.ts b/src/interpreter/interpreter.ts index d7ef6ef43..293fe7639 100644 --- a/src/interpreter/interpreter.ts +++ b/src/interpreter/interpreter.ts @@ -64,15 +64,15 @@ import { getType, hasStaticConstant, hasStaticFunction, -} from "../types/resolveDescriptors"; -import { getExpType } from "../types/resolveExpression"; +} from "../060-types/resolveDescriptors"; +import { getExpType } from "../060-types/resolveExpression"; import { CommentValue, StructValue, TypeRef, Value, showValue, -} from "../types/types"; +} from "../060-types/types"; import { sha256_sync } from "@ton/crypto"; import { defaultParser } from "../050-grammar/grammar"; diff --git a/src/optimizer/associative.ts b/src/optimizer/associative.ts index a459e1015..4266e875f 100644 --- a/src/optimizer/associative.ts +++ b/src/optimizer/associative.ts @@ -8,7 +8,7 @@ import { isValue, } from "../050-grammar/ast"; import * as interpreterModule from "../interpreter/interpreter"; -import { Value } from "../types/types"; +import { Value } from "../060-types/types"; import { ExpressionTransformer, Rule } from "./types"; import { abs, diff --git a/src/optimizer/util.ts b/src/optimizer/util.ts index 15a75f828..7ff1541d5 100644 --- a/src/optimizer/util.ts +++ b/src/optimizer/util.ts @@ -8,7 +8,7 @@ import { } from "../050-grammar/ast"; import { dummySrcInfo } from "../050-grammar"; import { throwInternalCompilerError } from "../030-error/errors"; -import { Value } from "../types/types"; +import { Value } from "../060-types/types"; export function extractValue(ast: AstValue): Value { switch ( From 21852deebfcf7f7b4e63de4199123a8aa868f143 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:43:09 +0400 Subject: [PATCH 11/26] move optimizer --- src/{optimizer => 070-optimizer}/algebraic.ts | 0 src/{optimizer => 070-optimizer}/associative.ts | 0 src/{optimizer => 070-optimizer}/standardOptimizer.ts | 0 src/{optimizer => 070-optimizer}/test/partial-eval.spec.ts | 0 src/{optimizer => 070-optimizer}/types.ts | 0 src/{optimizer => 070-optimizer}/util.ts | 0 src/interpreter/constEval.ts | 6 +++--- src/interpreter/interpreter.ts | 2 +- 8 files changed, 4 insertions(+), 4 deletions(-) rename src/{optimizer => 070-optimizer}/algebraic.ts (100%) rename src/{optimizer => 070-optimizer}/associative.ts (100%) rename src/{optimizer => 070-optimizer}/standardOptimizer.ts (100%) rename src/{optimizer => 070-optimizer}/test/partial-eval.spec.ts (100%) rename src/{optimizer => 070-optimizer}/types.ts (100%) rename src/{optimizer => 070-optimizer}/util.ts (100%) diff --git a/src/optimizer/algebraic.ts b/src/070-optimizer/algebraic.ts similarity index 100% rename from src/optimizer/algebraic.ts rename to src/070-optimizer/algebraic.ts diff --git a/src/optimizer/associative.ts b/src/070-optimizer/associative.ts similarity index 100% rename from src/optimizer/associative.ts rename to src/070-optimizer/associative.ts diff --git a/src/optimizer/standardOptimizer.ts b/src/070-optimizer/standardOptimizer.ts similarity index 100% rename from src/optimizer/standardOptimizer.ts rename to src/070-optimizer/standardOptimizer.ts diff --git a/src/optimizer/test/partial-eval.spec.ts b/src/070-optimizer/test/partial-eval.spec.ts similarity index 100% rename from src/optimizer/test/partial-eval.spec.ts rename to src/070-optimizer/test/partial-eval.spec.ts diff --git a/src/optimizer/types.ts b/src/070-optimizer/types.ts similarity index 100% rename from src/optimizer/types.ts rename to src/070-optimizer/types.ts diff --git a/src/optimizer/util.ts b/src/070-optimizer/util.ts similarity index 100% rename from src/optimizer/util.ts rename to src/070-optimizer/util.ts diff --git a/src/interpreter/constEval.ts b/src/interpreter/constEval.ts index 5109d19b9..66dd6a141 100644 --- a/src/interpreter/constEval.ts +++ b/src/interpreter/constEval.ts @@ -8,9 +8,9 @@ import { } from "../050-grammar/ast"; import { TactConstEvalError } from "../030-error/errors"; import { Value } from "../060-types/types"; -import { AstUtil, extractValue } from "../optimizer/util"; -import { ExpressionTransformer } from "../optimizer/types"; -import { StandardOptimizer } from "../optimizer/standardOptimizer"; +import { AstUtil, extractValue } from "../070-optimizer/util"; +import { ExpressionTransformer } from "../070-optimizer/types"; +import { StandardOptimizer } from "../070-optimizer/standardOptimizer"; import { Interpreter, InterpreterConfig, diff --git a/src/interpreter/interpreter.ts b/src/interpreter/interpreter.ts index 293fe7639..8647abfdd 100644 --- a/src/interpreter/interpreter.ts +++ b/src/interpreter/interpreter.ts @@ -57,7 +57,7 @@ import { isSelfId, } from "../050-grammar/ast"; import { SrcInfo, dummySrcInfo, Parser, getParser } from "../050-grammar"; -import { divFloor, modFloor } from "../optimizer/util"; +import { divFloor, modFloor } from "../070-optimizer/util"; import { getStaticConstant, getStaticFunction, From 23f82b4591eaec9e0bd2d3870e0fcf523b038f01 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:47:38 +0400 Subject: [PATCH 12/26] move generator --- CONTRIBUTING.md | 2 +- src/010-pipeline/build.ts | 2 +- src/010-pipeline/compile.ts | 4 ++-- src/060-types/resolveAllocation.ts | 2 +- src/060-types/resolveDescriptors.ts | 2 +- src/060-types/resolveExpression.ts | 6 +++--- src/060-types/resolveSignatures.ts | 2 +- src/{generator => 080-generator}/Writer.ts | 0 .../builtins}/AbiFunction.ts | 10 +++++----- src/{abi => 080-generator/builtins}/errors.ts | 0 src/{abi => 080-generator/builtins}/global.ts | 14 +++++++------- src/{abi => 080-generator/builtins}/map.ts | 18 +++++++++--------- src/{abi => 080-generator/builtins}/struct.ts | 8 ++++---- src/{generator => 080-generator}/createABI.ts | 2 +- .../emitter/createPadded.ts | 0 .../emitter/emit.ts | 0 .../writeProgram.ts | 0 .../writeReport.ts | 0 .../writeSerialization.spec.ts.snap | 0 .../writers/cast.ts | 0 .../writers/freshIdentifier.ts | 0 src/{generator => 080-generator}/writers/id.ts | 0 .../writers/ops.ts | 0 .../writers/resolveFuncFlatPack.ts | 0 .../writers/resolveFuncFlatTypes.ts | 0 .../writers/resolveFuncPrimitive.ts | 0 .../writers/resolveFuncTupleType.ts | 0 .../writers/resolveFuncType.spec.ts | 0 .../writers/resolveFuncType.ts | 0 .../writers/resolveFuncTypeFromAbi.ts | 0 .../writers/resolveFuncTypeFromAbiUnpack.ts | 0 .../writers/resolveFuncTypeUnpack.ts | 0 .../writers/writeAccessors.ts | 2 +- .../writers/writeConstant.ts | 0 .../writers/writeContract.ts | 2 +- .../writers/writeExpression.spec.ts | 0 .../writers/writeExpression.ts | 6 +++--- .../writers/writeFunction.ts | 0 .../writers/writeInterfaces.ts | 0 .../writers/writeRouter.ts | 0 .../writers/writeSerialization.spec.ts | 0 .../writers/writeSerialization.ts | 2 +- .../writers/writeStdlib.ts | 2 +- 43 files changed, 43 insertions(+), 43 deletions(-) rename src/{generator => 080-generator}/Writer.ts (100%) rename src/{abi => 080-generator/builtins}/AbiFunction.ts (51%) rename src/{abi => 080-generator/builtins}/errors.ts (100%) rename src/{abi => 080-generator/builtins}/global.ts (98%) rename src/{abi => 080-generator/builtins}/map.ts (98%) rename src/{abi => 080-generator/builtins}/struct.ts (97%) rename src/{generator => 080-generator}/createABI.ts (99%) rename src/{generator => 080-generator}/emitter/createPadded.ts (100%) rename src/{generator => 080-generator}/emitter/emit.ts (100%) rename src/{generator => 080-generator}/writeProgram.ts (100%) rename src/{generator => 080-generator}/writeReport.ts (100%) rename src/{generator => 080-generator}/writers/__snapshots__/writeSerialization.spec.ts.snap (100%) rename src/{generator => 080-generator}/writers/cast.ts (100%) rename src/{generator => 080-generator}/writers/freshIdentifier.ts (100%) rename src/{generator => 080-generator}/writers/id.ts (100%) rename src/{generator => 080-generator}/writers/ops.ts (100%) rename src/{generator => 080-generator}/writers/resolveFuncFlatPack.ts (100%) rename src/{generator => 080-generator}/writers/resolveFuncFlatTypes.ts (100%) rename src/{generator => 080-generator}/writers/resolveFuncPrimitive.ts (100%) rename src/{generator => 080-generator}/writers/resolveFuncTupleType.ts (100%) rename src/{generator => 080-generator}/writers/resolveFuncType.spec.ts (100%) rename src/{generator => 080-generator}/writers/resolveFuncType.ts (100%) rename src/{generator => 080-generator}/writers/resolveFuncTypeFromAbi.ts (100%) rename src/{generator => 080-generator}/writers/resolveFuncTypeFromAbiUnpack.ts (100%) rename src/{generator => 080-generator}/writers/resolveFuncTypeUnpack.ts (100%) rename src/{generator => 080-generator}/writers/writeAccessors.ts (99%) rename src/{generator => 080-generator}/writers/writeConstant.ts (100%) rename src/{generator => 080-generator}/writers/writeContract.ts (99%) rename src/{generator => 080-generator}/writers/writeExpression.spec.ts (100%) rename src/{generator => 080-generator}/writers/writeExpression.ts (99%) rename src/{generator => 080-generator}/writers/writeFunction.ts (100%) rename src/{generator => 080-generator}/writers/writeInterfaces.ts (100%) rename src/{generator => 080-generator}/writers/writeRouter.ts (100%) rename src/{generator => 080-generator}/writers/writeSerialization.spec.ts (100%) rename src/{generator => 080-generator}/writers/writeSerialization.ts (99%) rename src/{generator => 080-generator}/writers/writeStdlib.ts (99%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c34d5a2a1..518efeae2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -157,7 +157,7 @@ The negative tests for constant evaluation are contained in the Tact files prefi Some general information on how Tact code maps to FunC is described in the Tact docs: . -The code generator lives in the [src/generator](./src/generator) sub-folder with the entry point in [src/generator/writeProgram.ts](./src/generator/writeProgram.ts). +The code generator lives in the [src/generator](./src/080-generator) sub-folder with the entry point in [src/generator/writeProgram.ts](src/080-generator/writeProgram.ts). The implementation that we have right now is being refactored to produce FunC ASTs and then pretty-print those ASTs as strings instead of producing source FunC code in one step. Here is the relevant pull request: . diff --git a/src/010-pipeline/build.ts b/src/010-pipeline/build.ts index b9a65bcd6..e1d63da58 100644 --- a/src/010-pipeline/build.ts +++ b/src/010-pipeline/build.ts @@ -5,7 +5,7 @@ import { featureEnable } from "../000-config/features"; import { ConfigProject } from "../000-config/parseConfig"; import { CompilerContext } from "./context"; import { funcCompile } from "../func/funcCompile"; -import { writeReport } from "../generator/writeReport"; +import { writeReport } from "../080-generator/writeReport"; import { getRawAST } from "../050-grammar/store"; import files from "../040-imports/stdlib"; import { ILogger, Logger } from "./logger"; diff --git a/src/010-pipeline/compile.ts b/src/010-pipeline/compile.ts index 6fa2888f9..234a24262 100644 --- a/src/010-pipeline/compile.ts +++ b/src/010-pipeline/compile.ts @@ -1,6 +1,6 @@ import { CompilerContext } from "./context"; -import { createABI } from "../generator/createABI"; -import { writeProgram } from "../generator/writeProgram"; +import { createABI } from "../080-generator/createABI"; +import { writeProgram } from "../080-generator/writeProgram"; export async function compile( ctx: CompilerContext, diff --git a/src/060-types/resolveAllocation.ts b/src/060-types/resolveAllocation.ts index 187d6e385..9ee45443f 100644 --- a/src/060-types/resolveAllocation.ts +++ b/src/060-types/resolveAllocation.ts @@ -6,7 +6,7 @@ import { StorageAllocation } from "./StorageAllocation"; import { AllocationOperation } from "./operation"; import { allocate, getAllocationOperationFromField } from "./allocator"; import { createABITypeRefFromTypeRef } from "./resolveABITypeRef"; -import { funcInitIdOf } from "../generator/writers/id"; +import { funcInitIdOf } from "../080-generator/writers/id"; import { throwInternalCompilerError } from "../030-error/errors"; import { idText } from "../050-grammar/ast"; diff --git a/src/060-types/resolveDescriptors.ts b/src/060-types/resolveDescriptors.ts index 016d6fa88..b84263660 100644 --- a/src/060-types/resolveDescriptors.ts +++ b/src/060-types/resolveDescriptors.ts @@ -52,7 +52,7 @@ import { } from "./resolveABITypeRef"; import { enabledExternals } from "../000-config/features"; import { isRuntimeType } from "./isRuntimeType"; -import { GlobalFunctions } from "../abi/global"; +import { GlobalFunctions } from "../080-generator/builtins/global"; import { ItemOrigin } from "../050-grammar"; import { getExpType, resolveExpression } from "./resolveExpression"; import { emptyContext } from "./resolveStatements"; diff --git a/src/060-types/resolveExpression.ts b/src/060-types/resolveExpression.ts index d889a347b..0e5d1a6a6 100644 --- a/src/060-types/resolveExpression.ts +++ b/src/060-types/resolveExpression.ts @@ -28,11 +28,11 @@ import { } from "./resolveDescriptors"; import { printTypeRef, TypeRef, typeRefEquals } from "./types"; import { StatementContext } from "./resolveStatements"; -import { MapFunctions } from "../abi/map"; -import { GlobalFunctions } from "../abi/global"; +import { MapFunctions } from "../080-generator/builtins/map"; +import { GlobalFunctions } from "../080-generator/builtins/global"; import { isAssignable, moreGeneralType } from "./subtyping"; import { throwInternalCompilerError } from "../030-error/errors"; -import { StructFunctions } from "../abi/struct"; +import { StructFunctions } from "../080-generator/builtins/struct"; import { prettyPrint } from "../prettyPrinter"; const store = createContextStore<{ diff --git a/src/060-types/resolveSignatures.ts b/src/060-types/resolveSignatures.ts index 5a15671c3..0f4ea3e08 100644 --- a/src/060-types/resolveSignatures.ts +++ b/src/060-types/resolveSignatures.ts @@ -15,7 +15,7 @@ import { } from "./types"; import { throwCompilationError } from "../030-error/errors"; import { AstNumber, AstReceiver } from "../050-grammar/ast"; -import { commentPseudoOpcode } from "../generator/writers/writeRouter"; +import { commentPseudoOpcode } from "../080-generator/writers/writeRouter"; import { sha256_sync } from "@ton/crypto"; import { dummySrcInfo } from "../050-grammar"; import { ensureInt } from "../interpreter/interpreter"; diff --git a/src/generator/Writer.ts b/src/080-generator/Writer.ts similarity index 100% rename from src/generator/Writer.ts rename to src/080-generator/Writer.ts diff --git a/src/abi/AbiFunction.ts b/src/080-generator/builtins/AbiFunction.ts similarity index 51% rename from src/abi/AbiFunction.ts rename to src/080-generator/builtins/AbiFunction.ts index 548646c47..a590a7499 100644 --- a/src/abi/AbiFunction.ts +++ b/src/080-generator/builtins/AbiFunction.ts @@ -1,8 +1,8 @@ -import { AstExpression } from "../050-grammar/ast"; -import { CompilerContext } from "../010-pipeline/context"; -import { WriterContext } from "../generator/Writer"; -import { TypeRef } from "../060-types/types"; -import { SrcInfo } from "../050-grammar"; +import { AstExpression } from "../../050-grammar/ast"; +import { CompilerContext } from "../../010-pipeline/context"; +import { WriterContext } from "../Writer"; +import { TypeRef } from "../../060-types/types"; +import { SrcInfo } from "../../050-grammar"; export type AbiFunction = { name: string; diff --git a/src/abi/errors.ts b/src/080-generator/builtins/errors.ts similarity index 100% rename from src/abi/errors.ts rename to src/080-generator/builtins/errors.ts diff --git a/src/abi/global.ts b/src/080-generator/builtins/global.ts similarity index 98% rename from src/abi/global.ts rename to src/080-generator/builtins/global.ts index 328a6702c..bb8690157 100644 --- a/src/abi/global.ts +++ b/src/080-generator/builtins/global.ts @@ -1,22 +1,22 @@ import { Address, beginCell, Cell, toNano } from "@ton/core"; -import { enabledDebug } from "../000-config/features"; +import { enabledDebug } from "../../000-config/features"; import { writeAddress, writeCell, writeSlice, -} from "../generator/writers/writeConstant"; +} from "../writers/writeConstant"; import { writeExpression, writeValue, -} from "../generator/writers/writeExpression"; -import { TactConstEvalError, throwCompilationError } from "../030-error/errors"; -import { evalConstantExpression } from "../interpreter/constEval"; -import { getErrorId } from "../060-types/resolveErrors"; +} from "../writers/writeExpression"; +import { TactConstEvalError, throwCompilationError } from "../../030-error/errors"; +import { evalConstantExpression } from "../../interpreter/constEval"; +import { getErrorId } from "../../060-types/resolveErrors"; import { AbiFunction } from "./AbiFunction"; import { sha256_sync } from "@ton/crypto"; import path from "path"; import { cwd } from "process"; -import { posixNormalize } from "../utils/filePath"; +import { posixNormalize } from "../../utils/filePath"; export const GlobalFunctions: Map = new Map([ [ diff --git a/src/abi/map.ts b/src/080-generator/builtins/map.ts similarity index 98% rename from src/abi/map.ts rename to src/080-generator/builtins/map.ts index 5066b96ad..151145574 100644 --- a/src/abi/map.ts +++ b/src/080-generator/builtins/map.ts @@ -1,13 +1,13 @@ -import { CompilerContext } from "../010-pipeline/context"; -import { SrcInfo } from "../050-grammar"; -import { TypeRef } from "../060-types/types"; -import { WriterContext } from "../generator/Writer"; -import { ops } from "../generator/writers/ops"; -import { writeExpression } from "../generator/writers/writeExpression"; -import { throwCompilationError } from "../030-error/errors"; -import { getType } from "../060-types/resolveDescriptors"; +import { CompilerContext } from "../../010-pipeline/context"; +import { SrcInfo } from "../../050-grammar"; +import { TypeRef } from "../../060-types/types"; +import { WriterContext } from "../Writer"; +import { ops } from "../writers/ops"; +import { writeExpression } from "../writers/writeExpression"; +import { throwCompilationError } from "../../030-error/errors"; +import { getType } from "../../060-types/resolveDescriptors"; import { AbiFunction } from "./AbiFunction"; -import { AstExpression } from "../050-grammar/ast"; +import { AstExpression } from "../../050-grammar/ast"; // Helper functions to avoid redundancy function checkArgumentsLength( diff --git a/src/abi/struct.ts b/src/080-generator/builtins/struct.ts similarity index 97% rename from src/abi/struct.ts rename to src/080-generator/builtins/struct.ts index 297183687..882be7f7e 100644 --- a/src/abi/struct.ts +++ b/src/080-generator/builtins/struct.ts @@ -1,7 +1,7 @@ -import { ops } from "../generator/writers/ops"; -import { writeExpression } from "../generator/writers/writeExpression"; -import { throwCompilationError } from "../030-error/errors"; -import { getType } from "../060-types/resolveDescriptors"; +import { ops } from "../writers/ops"; +import { writeExpression } from "../writers/writeExpression"; +import { throwCompilationError } from "../../030-error/errors"; +import { getType } from "../../060-types/resolveDescriptors"; import { AbiFunction } from "./AbiFunction"; export const StructFunctions: Map = new Map([ diff --git a/src/generator/createABI.ts b/src/080-generator/createABI.ts similarity index 99% rename from src/generator/createABI.ts rename to src/080-generator/createABI.ts index 31218140d..982cff619 100644 --- a/src/generator/createABI.ts +++ b/src/080-generator/createABI.ts @@ -1,5 +1,5 @@ import { ABIGetter, ABIReceiver, ABIType, ContractABI } from "@ton/core"; -import { contractErrors } from "../abi/errors"; +import { contractErrors } from "./builtins/errors"; import { CompilerContext } from "../010-pipeline/context"; import { idText } from "../050-grammar/ast"; import { getSupportedInterfaces } from "../060-types/getSupportedInterfaces"; diff --git a/src/generator/emitter/createPadded.ts b/src/080-generator/emitter/createPadded.ts similarity index 100% rename from src/generator/emitter/createPadded.ts rename to src/080-generator/emitter/createPadded.ts diff --git a/src/generator/emitter/emit.ts b/src/080-generator/emitter/emit.ts similarity index 100% rename from src/generator/emitter/emit.ts rename to src/080-generator/emitter/emit.ts diff --git a/src/generator/writeProgram.ts b/src/080-generator/writeProgram.ts similarity index 100% rename from src/generator/writeProgram.ts rename to src/080-generator/writeProgram.ts diff --git a/src/generator/writeReport.ts b/src/080-generator/writeReport.ts similarity index 100% rename from src/generator/writeReport.ts rename to src/080-generator/writeReport.ts diff --git a/src/generator/writers/__snapshots__/writeSerialization.spec.ts.snap b/src/080-generator/writers/__snapshots__/writeSerialization.spec.ts.snap similarity index 100% rename from src/generator/writers/__snapshots__/writeSerialization.spec.ts.snap rename to src/080-generator/writers/__snapshots__/writeSerialization.spec.ts.snap diff --git a/src/generator/writers/cast.ts b/src/080-generator/writers/cast.ts similarity index 100% rename from src/generator/writers/cast.ts rename to src/080-generator/writers/cast.ts diff --git a/src/generator/writers/freshIdentifier.ts b/src/080-generator/writers/freshIdentifier.ts similarity index 100% rename from src/generator/writers/freshIdentifier.ts rename to src/080-generator/writers/freshIdentifier.ts diff --git a/src/generator/writers/id.ts b/src/080-generator/writers/id.ts similarity index 100% rename from src/generator/writers/id.ts rename to src/080-generator/writers/id.ts diff --git a/src/generator/writers/ops.ts b/src/080-generator/writers/ops.ts similarity index 100% rename from src/generator/writers/ops.ts rename to src/080-generator/writers/ops.ts diff --git a/src/generator/writers/resolveFuncFlatPack.ts b/src/080-generator/writers/resolveFuncFlatPack.ts similarity index 100% rename from src/generator/writers/resolveFuncFlatPack.ts rename to src/080-generator/writers/resolveFuncFlatPack.ts diff --git a/src/generator/writers/resolveFuncFlatTypes.ts b/src/080-generator/writers/resolveFuncFlatTypes.ts similarity index 100% rename from src/generator/writers/resolveFuncFlatTypes.ts rename to src/080-generator/writers/resolveFuncFlatTypes.ts diff --git a/src/generator/writers/resolveFuncPrimitive.ts b/src/080-generator/writers/resolveFuncPrimitive.ts similarity index 100% rename from src/generator/writers/resolveFuncPrimitive.ts rename to src/080-generator/writers/resolveFuncPrimitive.ts diff --git a/src/generator/writers/resolveFuncTupleType.ts b/src/080-generator/writers/resolveFuncTupleType.ts similarity index 100% rename from src/generator/writers/resolveFuncTupleType.ts rename to src/080-generator/writers/resolveFuncTupleType.ts diff --git a/src/generator/writers/resolveFuncType.spec.ts b/src/080-generator/writers/resolveFuncType.spec.ts similarity index 100% rename from src/generator/writers/resolveFuncType.spec.ts rename to src/080-generator/writers/resolveFuncType.spec.ts diff --git a/src/generator/writers/resolveFuncType.ts b/src/080-generator/writers/resolveFuncType.ts similarity index 100% rename from src/generator/writers/resolveFuncType.ts rename to src/080-generator/writers/resolveFuncType.ts diff --git a/src/generator/writers/resolveFuncTypeFromAbi.ts b/src/080-generator/writers/resolveFuncTypeFromAbi.ts similarity index 100% rename from src/generator/writers/resolveFuncTypeFromAbi.ts rename to src/080-generator/writers/resolveFuncTypeFromAbi.ts diff --git a/src/generator/writers/resolveFuncTypeFromAbiUnpack.ts b/src/080-generator/writers/resolveFuncTypeFromAbiUnpack.ts similarity index 100% rename from src/generator/writers/resolveFuncTypeFromAbiUnpack.ts rename to src/080-generator/writers/resolveFuncTypeFromAbiUnpack.ts diff --git a/src/generator/writers/resolveFuncTypeUnpack.ts b/src/080-generator/writers/resolveFuncTypeUnpack.ts similarity index 100% rename from src/generator/writers/resolveFuncTypeUnpack.ts rename to src/080-generator/writers/resolveFuncTypeUnpack.ts diff --git a/src/generator/writers/writeAccessors.ts b/src/080-generator/writers/writeAccessors.ts similarity index 99% rename from src/generator/writers/writeAccessors.ts rename to src/080-generator/writers/writeAccessors.ts index 2b63f8d53..15445c70e 100644 --- a/src/generator/writers/writeAccessors.ts +++ b/src/080-generator/writers/writeAccessors.ts @@ -1,4 +1,4 @@ -import { contractErrors } from "../../abi/errors"; +import { contractErrors } from "../builtins/errors"; import { maxTupleSize } from "../../bindings/typescript/writeStruct"; import { ItemOrigin } from "../../050-grammar"; import { getType } from "../../060-types/resolveDescriptors"; diff --git a/src/generator/writers/writeConstant.ts b/src/080-generator/writers/writeConstant.ts similarity index 100% rename from src/generator/writers/writeConstant.ts rename to src/080-generator/writers/writeConstant.ts diff --git a/src/generator/writers/writeContract.ts b/src/080-generator/writers/writeContract.ts similarity index 99% rename from src/generator/writers/writeContract.ts rename to src/080-generator/writers/writeContract.ts index d1d80abe7..9d76d0346 100644 --- a/src/generator/writers/writeContract.ts +++ b/src/080-generator/writers/writeContract.ts @@ -1,4 +1,4 @@ -import { contractErrors } from "../../abi/errors"; +import { contractErrors } from "../builtins/errors"; import { enabledInline, enabledInterfacesGetter, diff --git a/src/generator/writers/writeExpression.spec.ts b/src/080-generator/writers/writeExpression.spec.ts similarity index 100% rename from src/generator/writers/writeExpression.spec.ts rename to src/080-generator/writers/writeExpression.spec.ts diff --git a/src/generator/writers/writeExpression.ts b/src/080-generator/writers/writeExpression.ts similarity index 99% rename from src/generator/writers/writeExpression.ts rename to src/080-generator/writers/writeExpression.ts index 516a58c5d..865ea958d 100644 --- a/src/generator/writers/writeExpression.ts +++ b/src/080-generator/writers/writeExpression.ts @@ -26,10 +26,10 @@ import { } from "../../060-types/types"; import { WriterContext } from "../Writer"; import { resolveFuncTypeUnpack } from "./resolveFuncTypeUnpack"; -import { MapFunctions } from "../../abi/map"; -import { GlobalFunctions } from "../../abi/global"; +import { MapFunctions } from "../builtins/map"; +import { GlobalFunctions } from "../builtins/global"; import { funcIdOf } from "./id"; -import { StructFunctions } from "../../abi/struct"; +import { StructFunctions } from "../builtins/struct"; import { resolveFuncType } from "./resolveFuncType"; import { Address, Cell, Slice } from "@ton/core"; import { diff --git a/src/generator/writers/writeFunction.ts b/src/080-generator/writers/writeFunction.ts similarity index 100% rename from src/generator/writers/writeFunction.ts rename to src/080-generator/writers/writeFunction.ts diff --git a/src/generator/writers/writeInterfaces.ts b/src/080-generator/writers/writeInterfaces.ts similarity index 100% rename from src/generator/writers/writeInterfaces.ts rename to src/080-generator/writers/writeInterfaces.ts diff --git a/src/generator/writers/writeRouter.ts b/src/080-generator/writers/writeRouter.ts similarity index 100% rename from src/generator/writers/writeRouter.ts rename to src/080-generator/writers/writeRouter.ts diff --git a/src/generator/writers/writeSerialization.spec.ts b/src/080-generator/writers/writeSerialization.spec.ts similarity index 100% rename from src/generator/writers/writeSerialization.spec.ts rename to src/080-generator/writers/writeSerialization.spec.ts diff --git a/src/generator/writers/writeSerialization.ts b/src/080-generator/writers/writeSerialization.ts similarity index 99% rename from src/generator/writers/writeSerialization.ts rename to src/080-generator/writers/writeSerialization.ts index ae0ef2ba6..54bd96f3c 100644 --- a/src/generator/writers/writeSerialization.ts +++ b/src/080-generator/writers/writeSerialization.ts @@ -1,4 +1,4 @@ -import { contractErrors } from "../../abi/errors"; +import { contractErrors } from "../builtins/errors"; import { throwInternalCompilerError } from "../../030-error/errors"; import { dummySrcInfo, ItemOrigin } from "../../050-grammar"; import { AllocationCell, AllocationOperation } from "../../060-types/operation"; diff --git a/src/generator/writers/writeStdlib.ts b/src/080-generator/writers/writeStdlib.ts similarity index 99% rename from src/generator/writers/writeStdlib.ts rename to src/080-generator/writers/writeStdlib.ts index 0872ff474..044fc2bab 100644 --- a/src/generator/writers/writeStdlib.ts +++ b/src/080-generator/writers/writeStdlib.ts @@ -1,4 +1,4 @@ -import { contractErrors } from "../../abi/errors"; +import { contractErrors } from "../builtins/errors"; import { maxTupleSize } from "../../bindings/typescript/writeStruct"; import { match } from "../../utils/tricks"; import { WriterContext } from "../Writer"; From 1be3ae73df34277a54c8effda8b6f4e17e62d2cd Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:33:21 +0400 Subject: [PATCH 13/26] move func --- .eslintignore | 2 +- .gitignore | 1 - .prettierignore | 3 +-- CONTRIBUTING.md | 6 ++--- package.json | 5 +++-- scripts/copy-files.ts | 5 ++--- scripts/prepare.ts | 2 +- src/010-pipeline/build.ts | 2 +- src/090-func/.gitignore | 1 + src/{func => 090-func}/__testdata__/small.fc | 0 src/090-func/copy.build.ts | 21 ++++++++++++++++++ src/{func => 090-func}/funcCompile.spec.ts | 0 src/{func => 090-func}/funcCompile.ts | 0 src/{func => 090-func}/funcfiftlib.js | 0 src/{func => 090-func}/funcfiftlib.wasm | Bin scripts/pack.ts => src/090-func/pack.build.ts | 2 +- 16 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 src/090-func/.gitignore rename src/{func => 090-func}/__testdata__/small.fc (100%) create mode 100644 src/090-func/copy.build.ts rename src/{func => 090-func}/funcCompile.spec.ts (100%) rename src/{func => 090-func}/funcCompile.ts (100%) rename src/{func => 090-func}/funcfiftlib.js (100%) rename src/{func => 090-func}/funcfiftlib.wasm (100%) rename scripts/pack.ts => src/090-func/pack.build.ts (96%) diff --git a/.eslintignore b/.eslintignore index 1ee328705..b22aef97e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,7 +3,7 @@ dist/ coverage/ **/output/ src/test/**/output/ -src/func/funcfiftlib.js +**/*.js **/grammar.ohm*.ts **/grammar.ohm*.js src/grammar/next/grammar.ts diff --git a/.gitignore b/.gitignore index 3152343ad..836605dd9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,4 @@ dist output/ **/grammar.ohm-bundle.js **/grammar.ohm-bundle.d.ts -src/func/funcfiftlib.wasm.js src/test/contracts/pretty-printer-output diff --git a/.prettierignore b/.prettierignore index f6a0d5517..0403df17c 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,6 +1,5 @@ /dist -/src/func/funcfiftlib.js -/src/func/funcfiftlib.wasm.js +**/*.js /src/050-grammar/prev/grammar.ohm-bundle.d.ts /src/050-grammar/prev/grammar.ohm-bundle.js src/050-grammar/next/grammar.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 518efeae2..8852ff009 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,9 +30,9 @@ The rest of the build and development dependencies are specified, as usual, in t Tact's pipeline uses a patched version of the FunC compiler vendored as a WASM binary with some JS wrappers, see the following files: -- [src/func/funcfiftlib.js](./src/func/funcfiftlib.js) -- [src/func/funcfiftlib.wasm](./src/func/funcfiftlib.wasm) -- [src/func/funcfiftlib.wasm.js](./src/func/funcfiftlib.wasm.js) +- [src/func/funcfiftlib.js](src/090-func/funcfiftlib.js) +- [src/func/funcfiftlib.wasm](src/090-func/funcfiftlib.wasm) +- [src/func/funcfiftlib.wasm.js](src/090-func/funcfiftlib.wasm.js) The message of the commit [`f777da3213e3b064a7f407b2569cfd546cca277e`](https://github.com/tact-lang/tact/commit/f777da3213e3b064a7f407b2569cfd546cca277e) explains how the patched version was obtained. We had to patch the FunC compiler because the corresponding [FunC compiler issue](https://github.com/ton-blockchain/ton/issues/971) is unresolved at the time of writing. diff --git a/package.json b/package.json index d168699fb..89972811f 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,13 @@ "gen:grammar:old": "ohm generateBundles --withTypes src/050-grammar/prev/*.ohm", "gen:grammar:new": "pgen src/050-grammar/next/grammar.gg -o src/050-grammar/next/grammar.ts", "gen:grammar": "yarn gen:grammar:old && yarn gen:grammar:new", - "gen:pack": "ts-node ./scripts/pack.ts", + "gen:pack": "ts-node src/090-func/pack.build.ts", "gen:compiler": "ts-node ./scripts/prepare.ts", "gen": "yarn gen:grammar && yarn gen:pack && yarn gen:compiler", "clean": "rm -fr dist", "cleanall": "rm -fr dist node_modules", - "build": "tsc && node --no-warnings=ExperimentalWarning -r ts-node/register ./scripts/copy-files", + "build:func": "ts-node ./src/090-func/copy.build.ts", + "build": "tsc && yarn build:func && yarn node --no-warnings=ExperimentalWarning -r ts-node/register ./scripts/copy-files", "test": "yarn gen:grammar && jest", "coverage": "cross-env COVERAGE=true jest", "release": "yarn clean && yarn build && yarn coverage && yarn release-it --npm.yarn1", diff --git a/scripts/copy-files.ts b/scripts/copy-files.ts index 39fd923c3..d1d55be0d 100644 --- a/scripts/copy-files.ts +++ b/scripts/copy-files.ts @@ -1,5 +1,5 @@ -import * as fs from "node:fs/promises"; -import * as path from "node:path"; +import * as fs from "fs/promises"; +import * as path from "path"; import * as glob from "glob"; const cp = async (fromGlob: string, toPath: string) => { @@ -12,7 +12,6 @@ const cp = async (fromGlob: string, toPath: string) => { const main = async () => { try { await cp("./src/grammar/prev/grammar.ohm*", "./dist/grammar/prev/"); - await cp("./src/func/funcfiftlib.*", "./dist/func/"); } catch (e) { console.error(e); process.exit(1); diff --git a/scripts/prepare.ts b/scripts/prepare.ts index 123fe6bff..a87d4a3e9 100644 --- a/scripts/prepare.ts +++ b/scripts/prepare.ts @@ -1,7 +1,7 @@ import fs from "fs"; import { decompileAll } from "@tact-lang/opcode"; import { run } from "../src/node"; -import { FuncCompilationResult, funcCompile } from "../src/func/funcCompile"; +import { FuncCompilationResult, funcCompile } from "../src/090-func/funcCompile"; import path from "path"; import { glob } from "glob"; import { verify } from "../src/verify"; diff --git a/src/010-pipeline/build.ts b/src/010-pipeline/build.ts index e1d63da58..44217f95e 100644 --- a/src/010-pipeline/build.ts +++ b/src/010-pipeline/build.ts @@ -4,7 +4,7 @@ import { writeTypescript } from "../bindings/writeTypescript"; import { featureEnable } from "../000-config/features"; import { ConfigProject } from "../000-config/parseConfig"; import { CompilerContext } from "./context"; -import { funcCompile } from "../func/funcCompile"; +import { funcCompile } from "../090-func/funcCompile"; import { writeReport } from "../080-generator/writeReport"; import { getRawAST } from "../050-grammar/store"; import files from "../040-imports/stdlib"; diff --git a/src/090-func/.gitignore b/src/090-func/.gitignore new file mode 100644 index 000000000..f5918109c --- /dev/null +++ b/src/090-func/.gitignore @@ -0,0 +1 @@ +funcfiftlib.wasm.js diff --git a/src/func/__testdata__/small.fc b/src/090-func/__testdata__/small.fc similarity index 100% rename from src/func/__testdata__/small.fc rename to src/090-func/__testdata__/small.fc diff --git a/src/090-func/copy.build.ts b/src/090-func/copy.build.ts new file mode 100644 index 000000000..51846b91f --- /dev/null +++ b/src/090-func/copy.build.ts @@ -0,0 +1,21 @@ +import * as fs from "fs/promises"; +import * as path from "path"; +import * as glob from "glob"; + +const cp = async (fromGlob: string, toPath: string) => { + const files = glob.sync(fromGlob); + for (const file of files) { + await fs.copyFile(file, path.join(toPath, path.basename(file))); + } +}; + +const main = async () => { + try { + await cp("./src/090-func/funcfiftlib.*", "./dist/func/"); + } catch (e) { + console.error(e); + process.exit(1); + } +}; + +void main(); diff --git a/src/func/funcCompile.spec.ts b/src/090-func/funcCompile.spec.ts similarity index 100% rename from src/func/funcCompile.spec.ts rename to src/090-func/funcCompile.spec.ts diff --git a/src/func/funcCompile.ts b/src/090-func/funcCompile.ts similarity index 100% rename from src/func/funcCompile.ts rename to src/090-func/funcCompile.ts diff --git a/src/func/funcfiftlib.js b/src/090-func/funcfiftlib.js similarity index 100% rename from src/func/funcfiftlib.js rename to src/090-func/funcfiftlib.js diff --git a/src/func/funcfiftlib.wasm b/src/090-func/funcfiftlib.wasm similarity index 100% rename from src/func/funcfiftlib.wasm rename to src/090-func/funcfiftlib.wasm diff --git a/scripts/pack.ts b/src/090-func/pack.build.ts similarity index 96% rename from scripts/pack.ts rename to src/090-func/pack.build.ts index a98072c20..66852f42e 100644 --- a/scripts/pack.ts +++ b/src/090-func/pack.build.ts @@ -1,7 +1,7 @@ import fs from "fs"; import path from "path"; import glob from "glob"; -import { posixNormalize } from "../src/utils/filePath"; +import { posixNormalize } from "../utils/filePath"; // Pack func const wasmBase64 = fs From 5649c358755f850ec6624fa05c834588f9c8c408 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:34:39 +0400 Subject: [PATCH 14/26] move bindings --- src/010-pipeline/build.ts | 2 +- src/080-generator/writers/writeAccessors.ts | 2 +- src/080-generator/writers/writeStdlib.ts | 2 +- src/{bindings => 100-bindings}/typescript/serializers.ts | 0 src/{bindings => 100-bindings}/typescript/writeStruct.ts | 0 src/{bindings => 100-bindings}/writeTypescript.ts | 0 6 files changed, 3 insertions(+), 3 deletions(-) rename src/{bindings => 100-bindings}/typescript/serializers.ts (100%) rename src/{bindings => 100-bindings}/typescript/writeStruct.ts (100%) rename src/{bindings => 100-bindings}/writeTypescript.ts (100%) diff --git a/src/010-pipeline/build.ts b/src/010-pipeline/build.ts index 44217f95e..7e0bd877f 100644 --- a/src/010-pipeline/build.ts +++ b/src/010-pipeline/build.ts @@ -1,6 +1,6 @@ import { beginCell, Cell, Dictionary } from "@ton/core"; import { decompileAll } from "@tact-lang/opcode"; -import { writeTypescript } from "../bindings/writeTypescript"; +import { writeTypescript } from "../100-bindings/writeTypescript"; import { featureEnable } from "../000-config/features"; import { ConfigProject } from "../000-config/parseConfig"; import { CompilerContext } from "./context"; diff --git a/src/080-generator/writers/writeAccessors.ts b/src/080-generator/writers/writeAccessors.ts index 15445c70e..1bcabdec2 100644 --- a/src/080-generator/writers/writeAccessors.ts +++ b/src/080-generator/writers/writeAccessors.ts @@ -1,5 +1,5 @@ import { contractErrors } from "../builtins/errors"; -import { maxTupleSize } from "../../bindings/typescript/writeStruct"; +import { maxTupleSize } from "../../100-bindings/typescript/writeStruct"; import { ItemOrigin } from "../../050-grammar"; import { getType } from "../../060-types/resolveDescriptors"; import { TypeDescription } from "../../060-types/types"; diff --git a/src/080-generator/writers/writeStdlib.ts b/src/080-generator/writers/writeStdlib.ts index 044fc2bab..8cf5ef292 100644 --- a/src/080-generator/writers/writeStdlib.ts +++ b/src/080-generator/writers/writeStdlib.ts @@ -1,5 +1,5 @@ import { contractErrors } from "../builtins/errors"; -import { maxTupleSize } from "../../bindings/typescript/writeStruct"; +import { maxTupleSize } from "../../100-bindings/typescript/writeStruct"; import { match } from "../../utils/tricks"; import { WriterContext } from "../Writer"; diff --git a/src/bindings/typescript/serializers.ts b/src/100-bindings/typescript/serializers.ts similarity index 100% rename from src/bindings/typescript/serializers.ts rename to src/100-bindings/typescript/serializers.ts diff --git a/src/bindings/typescript/writeStruct.ts b/src/100-bindings/typescript/writeStruct.ts similarity index 100% rename from src/bindings/typescript/writeStruct.ts rename to src/100-bindings/typescript/writeStruct.ts diff --git a/src/bindings/writeTypescript.ts b/src/100-bindings/writeTypescript.ts similarity index 100% rename from src/bindings/writeTypescript.ts rename to src/100-bindings/writeTypescript.ts From d9ced695e3d707dc3ee3eb09a9598b6017739c41 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:35:33 +0400 Subject: [PATCH 15/26] move interpreter --- CONTRIBUTING.md | 2 +- src/060-types/resolveDescriptors.ts | 2 +- src/060-types/resolveErrors.ts | 2 +- src/060-types/resolveSignatures.ts | 4 ++-- src/060-types/resolveStatements.ts | 4 ++-- src/070-optimizer/associative.ts | 2 +- src/{interpreter => 070-optimizer}/constEval.ts | 6 +++--- src/{interpreter => 070-optimizer}/interpreter.ts | 2 +- src/070-optimizer/test/partial-eval.spec.ts | 4 ++-- src/080-generator/builtins/global.ts | 2 +- src/080-generator/writers/writeExpression.ts | 2 +- src/node.ts | 2 +- 12 files changed, 17 insertions(+), 17 deletions(-) rename src/{interpreter => 070-optimizer}/constEval.ts (97%) rename src/{interpreter => 070-optimizer}/interpreter.ts (99%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8852ff009..aa0ca6cf4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -147,7 +147,7 @@ The constant evaluator is used as an optimizer to prevent some statically known The constant evaluator supports a large subset of Tact and handles, for instance, constants defined in terms of other constants, built-in and user-defined functions, logical and arithmetic operations. -The main logic of the constant evaluator can be found in the file [src/interpreter.ts](src/interpreter/interpreter.ts). +The main logic of the constant evaluator can be found in the file [src/interpreter.ts](src/070-optimizer/interpreter.ts). You can find the relevant tests in [src/test/e2e-emulated/contracts/constants.tact](./src/test/e2e-emulated/contracts/constants.tact) and the corresponding spec-file: [](./src/test/e2e-emulated/constants.spec.ts). diff --git a/src/060-types/resolveDescriptors.ts b/src/060-types/resolveDescriptors.ts index b84263660..9dbbcbed4 100644 --- a/src/060-types/resolveDescriptors.ts +++ b/src/060-types/resolveDescriptors.ts @@ -44,7 +44,7 @@ import { getRawAST } from "../050-grammar/store"; import { cloneNode } from "../050-grammar/clone"; import { crc16 } from "../utils/crc16"; import { isSubsetOf } from "../utils/isSubsetOf"; -import { evalConstantExpression } from "../interpreter/constEval"; +import { evalConstantExpression } from "../070-optimizer/constEval"; import { resolveABIType, intMapKeyFormats, diff --git a/src/060-types/resolveErrors.ts b/src/060-types/resolveErrors.ts index ff74b4b46..b39a42960 100644 --- a/src/060-types/resolveErrors.ts +++ b/src/060-types/resolveErrors.ts @@ -2,7 +2,7 @@ import { sha256_sync } from "@ton/crypto"; import { CompilerContext, createContextStore } from "../010-pipeline/context"; import { AstNode, isRequire } from "../050-grammar/ast"; import { traverse } from "../050-grammar/iterators"; -import { evalConstantExpression } from "../interpreter/constEval"; +import { evalConstantExpression } from "../070-optimizer/constEval"; import { throwInternalCompilerError } from "../030-error/errors"; import { getAllStaticFunctions, diff --git a/src/060-types/resolveSignatures.ts b/src/060-types/resolveSignatures.ts index 0f4ea3e08..4f5c03d23 100644 --- a/src/060-types/resolveSignatures.ts +++ b/src/060-types/resolveSignatures.ts @@ -18,8 +18,8 @@ import { AstNumber, AstReceiver } from "../050-grammar/ast"; import { commentPseudoOpcode } from "../080-generator/writers/writeRouter"; import { sha256_sync } from "@ton/crypto"; import { dummySrcInfo } from "../050-grammar"; -import { ensureInt } from "../interpreter/interpreter"; -import { evalConstantExpression } from "../interpreter/constEval"; +import { ensureInt } from "../070-optimizer/interpreter"; +import { evalConstantExpression } from "../070-optimizer/constEval"; export function resolveSignatures(ctx: CompilerContext) { const signatures: Map< diff --git a/src/060-types/resolveStatements.ts b/src/060-types/resolveStatements.ts index c488095e9..6822c744f 100644 --- a/src/060-types/resolveStatements.ts +++ b/src/060-types/resolveStatements.ts @@ -27,8 +27,8 @@ import { } from "./resolveDescriptors"; import { getExpType, resolveExpression } from "./resolveExpression"; import { FunctionDescription, printTypeRef, TypeRef } from "./types"; -import { evalConstantExpression } from "../interpreter/constEval"; -import { ensureInt } from "../interpreter/interpreter"; +import { evalConstantExpression } from "../070-optimizer/constEval"; +import { ensureInt } from "../070-optimizer/interpreter"; import { crc16 } from "../utils/crc16"; import { SrcInfo } from "../050-grammar"; diff --git a/src/070-optimizer/associative.ts b/src/070-optimizer/associative.ts index 4266e875f..837d01e03 100644 --- a/src/070-optimizer/associative.ts +++ b/src/070-optimizer/associative.ts @@ -7,7 +7,7 @@ import { AstValue, isValue, } from "../050-grammar/ast"; -import * as interpreterModule from "../interpreter/interpreter"; +import * as interpreterModule from "./interpreter"; import { Value } from "../060-types/types"; import { ExpressionTransformer, Rule } from "./types"; import { diff --git a/src/interpreter/constEval.ts b/src/070-optimizer/constEval.ts similarity index 97% rename from src/interpreter/constEval.ts rename to src/070-optimizer/constEval.ts index 66dd6a141..32ac2b840 100644 --- a/src/interpreter/constEval.ts +++ b/src/070-optimizer/constEval.ts @@ -8,9 +8,9 @@ import { } from "../050-grammar/ast"; import { TactConstEvalError } from "../030-error/errors"; import { Value } from "../060-types/types"; -import { AstUtil, extractValue } from "../070-optimizer/util"; -import { ExpressionTransformer } from "../070-optimizer/types"; -import { StandardOptimizer } from "../070-optimizer/standardOptimizer"; +import { AstUtil, extractValue } from "./util"; +import { ExpressionTransformer } from "./types"; +import { StandardOptimizer } from "./standardOptimizer"; import { Interpreter, InterpreterConfig, diff --git a/src/interpreter/interpreter.ts b/src/070-optimizer/interpreter.ts similarity index 99% rename from src/interpreter/interpreter.ts rename to src/070-optimizer/interpreter.ts index 8647abfdd..d859cea9b 100644 --- a/src/interpreter/interpreter.ts +++ b/src/070-optimizer/interpreter.ts @@ -57,7 +57,7 @@ import { isSelfId, } from "../050-grammar/ast"; import { SrcInfo, dummySrcInfo, Parser, getParser } from "../050-grammar"; -import { divFloor, modFloor } from "../070-optimizer/util"; +import { divFloor, modFloor } from "./util"; import { getStaticConstant, getStaticFunction, diff --git a/src/070-optimizer/test/partial-eval.spec.ts b/src/070-optimizer/test/partial-eval.spec.ts index 88bf72a74..7c13c6628 100644 --- a/src/070-optimizer/test/partial-eval.spec.ts +++ b/src/070-optimizer/test/partial-eval.spec.ts @@ -7,11 +7,11 @@ import { isValue, } from "../../050-grammar/ast"; import { AstUtil, extractValue, getAstUtil } from "../util"; -import { getOptimizer } from "../../interpreter/constEval"; +import { getOptimizer } from "../constEval"; import { CompilerContext } from "../../010-pipeline/context"; import { ExpressionTransformer, Rule } from "../types"; import { AssociativeRule3 } from "../associative"; -import { evalBinaryOp, evalUnaryOp } from "../../interpreter/interpreter"; +import { evalBinaryOp, evalUnaryOp } from "../interpreter"; import { getParser } from "../../050-grammar"; import { defaultParser } from "../../050-grammar/grammar"; diff --git a/src/080-generator/builtins/global.ts b/src/080-generator/builtins/global.ts index bb8690157..4afde0897 100644 --- a/src/080-generator/builtins/global.ts +++ b/src/080-generator/builtins/global.ts @@ -10,7 +10,7 @@ import { writeValue, } from "../writers/writeExpression"; import { TactConstEvalError, throwCompilationError } from "../../030-error/errors"; -import { evalConstantExpression } from "../../interpreter/constEval"; +import { evalConstantExpression } from "../../070-optimizer/constEval"; import { getErrorId } from "../../060-types/resolveErrors"; import { AbiFunction } from "./AbiFunction"; import { sha256_sync } from "@ton/crypto"; diff --git a/src/080-generator/writers/writeExpression.ts b/src/080-generator/writers/writeExpression.ts index 865ea958d..35fb560ea 100644 --- a/src/080-generator/writers/writeExpression.ts +++ b/src/080-generator/writers/writeExpression.ts @@ -41,7 +41,7 @@ import { } from "./writeConstant"; import { ops } from "./ops"; import { writeCastedExpression } from "./writeFunction"; -import { evalConstantExpression } from "../../interpreter/constEval"; +import { evalConstantExpression } from "../../070-optimizer/constEval"; import { isLvalue } from "../../060-types/resolveStatements"; function isNull(wCtx: WriterContext, expr: AstExpression): boolean { diff --git a/src/node.ts b/src/node.ts index 5570cf489..2c4f2f680 100644 --- a/src/node.ts +++ b/src/node.ts @@ -143,4 +143,4 @@ export async function run(args: { export { createNodeFileSystem } from "./020-vfs/createNodeFileSystem"; -export { parseAndEvalExpression } from "./interpreter/interpreter"; +export { parseAndEvalExpression } from "./070-optimizer/interpreter"; From 7e5318c4bd8ee95e9a71b6ce92cf0748e4c63777 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:35:57 +0400 Subject: [PATCH 16/26] move packaging --- src/010-pipeline/build.ts | 4 ++-- src/080-generator/writeReport.ts | 2 +- src/{packaging => 110-packaging}/fileFormat.ts | 0 src/{packaging => 110-packaging}/packageCode.ts | 0 src/main.ts | 2 +- src/verify.ts | 2 +- 6 files changed, 5 insertions(+), 5 deletions(-) rename src/{packaging => 110-packaging}/fileFormat.ts (100%) rename src/{packaging => 110-packaging}/packageCode.ts (100%) diff --git a/src/010-pipeline/build.ts b/src/010-pipeline/build.ts index 7e0bd877f..5347c3e92 100644 --- a/src/010-pipeline/build.ts +++ b/src/010-pipeline/build.ts @@ -9,8 +9,8 @@ import { writeReport } from "../080-generator/writeReport"; import { getRawAST } from "../050-grammar/store"; import files from "../040-imports/stdlib"; import { ILogger, Logger } from "./logger"; -import { PackageFileFormat } from "../packaging/fileFormat"; -import { packageCode } from "../packaging/packageCode"; +import { PackageFileFormat } from "../110-packaging/fileFormat"; +import { packageCode } from "../110-packaging/packageCode"; import { createABITypeRefFromTypeRef } from "../060-types/resolveABITypeRef"; import { getContracts, getType } from "../060-types/resolveDescriptors"; import { posixNormalize } from "../utils/filePath"; diff --git a/src/080-generator/writeReport.ts b/src/080-generator/writeReport.ts index 155882dcc..81083b840 100644 --- a/src/080-generator/writeReport.ts +++ b/src/080-generator/writeReport.ts @@ -1,6 +1,6 @@ import { ContractABI } from "@ton/core"; import { CompilerContext } from "../010-pipeline/context"; -import { PackageFileFormat } from "../packaging/fileFormat"; +import { PackageFileFormat } from "../110-packaging/fileFormat"; import { getType } from "../060-types/resolveDescriptors"; import { Writer } from "../utils/Writer"; import { TypeDescription } from "../060-types/types"; diff --git a/src/packaging/fileFormat.ts b/src/110-packaging/fileFormat.ts similarity index 100% rename from src/packaging/fileFormat.ts rename to src/110-packaging/fileFormat.ts diff --git a/src/packaging/packageCode.ts b/src/110-packaging/packageCode.ts similarity index 100% rename from src/packaging/packageCode.ts rename to src/110-packaging/packageCode.ts diff --git a/src/main.ts b/src/main.ts index 2fb579ec4..c288257e2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,7 +5,7 @@ export { verifyConfig, } from "./000-config/parseConfig"; -export { PackageFileFormat } from "./packaging/fileFormat"; +export { PackageFileFormat } from "./110-packaging/fileFormat"; export { build } from "./010-pipeline/build"; diff --git a/src/verify.ts b/src/verify.ts index 0b176e828..95c6b5433 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -3,7 +3,7 @@ import { Cell } from "@ton/core"; import { Config, Options } from "./000-config/parseConfig"; import { ILogger, Logger } from "./010-pipeline/logger"; import { PackageFileFormat, run } from "./main"; -import { fileFormat } from "./packaging/fileFormat"; +import { fileFormat } from "./110-packaging/fileFormat"; import { getCompilerVersion } from "./010-pipeline/version"; export type VerifyResult = From 6a15e272227a6369ac3c3d08fd8836c8541b5be5 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:41:01 +0400 Subject: [PATCH 17/26] remove func binary --- scripts/func | Bin 797400 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 scripts/func diff --git a/scripts/func b/scripts/func deleted file mode 100755 index d7cef24aa59aa46c31cb685634f6d2bcf7cce56a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 797400 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%0DqhE3`y;hf$w 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 xDwgTJjZ;Q7({3*VU%;a@!rVe-PuO4!I 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�|!wRO|I zrz{JCrv_gbAA1M8zb<{qGy1T_5qQSLhqk9PI9IEy)3U&{YkCusXL#RK0>O1(Qg_W@ z_ZX>r_iuBLL^=Z6S^YO1fmxyTR~q%NwJa!$)7Q8**)w{D`lo(L{bL5ZBc=Yz-|A!e ziX$*BwC*&c?s=94-q?`+s8!VM8+2j3Y#-!4s_7L*-K!jd@zl+^x(Qx*hF}i%0JzF_HKi{rwj6Y-TNDEjG{cv$Zz3j~^YC^l0 zc@;(7UA!}VNt)jFR9&Axpm#ZUdkyRJ2Yl=HtFzvkoZPaSxwwY8xb_J1aq=MeK%(b8 zfw|!wEtZ0}p)uhqR#>dJdZ z$89A%4w$5_Q@gFiagu#KY?HGb{>)j5Klm%_!1aKmHB!&+?YZ6)@Y{Kgz+US4HEY@~ z7rGq31y1itzEuuN~^G){iPrz@5uiDwiI|9z5d6%+pAbSh;!S?pc*po`le8G(Cb2ixvAbJ6RFF(uGkhk-s!Hor_%r9U zTC>xR`)FFd*yZ=hmSY{Kc#=? z@Q0#4{-CvK_}7WvIK~Elknh7eBfwdKCgCOg&Sc-xTq9hJ9xZ-WRg4Mt*Ns)cUPn6( zl}d91a;mXr*Q6?Zc4d#=$$!&sd_EcR3Tu%8c}yDpHF?aNiq2yyz{4k&3*%wC#hoE| zNHg&8O-JBi;FC5qS+T{ETXwm@&sQnEa>)Cp9Xa$Rbz2 zvE(`231xQ~K+Z;4UwWaht7uT#ne)!edub<;C# z$j%C-HTb4_VH~W*MkDnFx9PNygI|tOUzya`pyoP@s4ued3GZD>>jhz(th#?Ebu}1u zjdcWKs7rJi*_(^x_mOeRM)56^^~6yAS70y9_&n(<-G*rM9O3^G_FC2l3YLF>ZRrK( z$YasNT-}`cdptVIW#PQgUgpE=#31;BZ;waEx`vY`c|Il2VD!yA&eRoLoqzHmamw@5 z!M?>;<)8e5-zAEqPd+K}%S#kVpM3I=_FMIhCVkAOoWuKcXwDaVhvsbM*}x;`4L|(s z*=1j_&z+^lx{7$#^Sc6ADmXK;-#X0mIOlv-%cAwxh|2YYM>y6GP0e3FQ~k#JS@>!E z$8cr+BPr^7v3)JU_O+TlzuoFE-?pw`aWwoy{M>Fi4qriM(tI%N=*7&FeAg|_vKFq7 z=G-Uz<^+64d>h3-$oojFTRHT?B-t-#?ATxWV%bsr=|txXKVOv`C;l|>C(g!5d{0?3 zcH`Uiha&Xc-t$!{o(}$tE|4PUtIz|z`0<6Fuexyod!7THuZs80l(U}b;LStuZ>MY~ zIP>CHDf+pbui7zsNBsihd=>qj9$J6z`Kqw|fw1#cW8Vl|{45JSxT{8|)0wsB*HgcDfW2I8 z4>^KZFq1nq|1QQy&Ymy9*04a0n%cnL#k!Dv~~%oxi)as{!o@SABF%RVx`Iu%{U zK5`xWalr5B_`-|KedNJ&IqM?+WVC1c=9qhiKGp=t&epVO_DzThAoc@|&jjOg%Y@JD zwJ#{#8Nz42V+l-Idy97d$_m^)_{C-}u(?!XK$_>W29a)gu3)*gURoRHwtvT5Cnb0; z@?3bGbYgVhI!W{^S?@%GS8uR0*Or7WUAlaj&j#<*J4$8^x#Jlo2M3=Gn2-hk}|Nr;@$Bncy{ny3@`mS$1S;s85~vmYBAkD)NL2Tz`s44)Me6i+g(secHVHn&uYvKF#=s+nuHj2>*Zd>GR3K&-R}y2MaY` zjc>mATdy6&8bSBdzo5VMWV?IjP~q2xpZ?hVz#3q1GG}b)B(kS1Fqr$iV(XD{Xat7~ z=%eU~`ZMfB9-EY9w~k#vX1kv{-S)6I?rS#Roc zC2g?sM21pZFLT1X7vB-`-!NENVbVV|)M?U_h2I*zlP}^w`{;e90sGO9u{q|Uze=2z zl7hfJz@zE2@*h2MI{z~VvH>ucO&h?bNZofJbPaz5-`TP--+`&{5b<5U2mhR%S2&t0 zupu-=xO|qW#Nk=+WJ}RP$8y=*ZlmtoI2*bTUEWNaGDXfp&c?TUlxHkB#s9STtfc8{ z(15SOSonr1pT_`usQ*+N|3#*V{?7Sk_nBwK2UXx8zs z?*-aCnoV?8wEOID#a*qqD;od@sui9wrI{9%S8KlcuEZxon#3!c6uFy(!u<0+UQ_%&^v z4^Ij(YW~FF?2ME;kSHCPE)Sa^N;dOpsZtza$PvSx4mfKdvA<;q1Lw;4d3Imz8Pn~cIOA4 zqi@OC%7kao{cJ0B8mfIU3_ojQ-E*W4-h!V|Qb*9hPf|hP$qV48g}mloemMQ~r<+92 z0rH01!>fN_^kZ_Yd#b>|Tl81_px8yG|c_xWt^*HuCHFC)3CRO^9;<*#TN~5k<3Ia`(HP70Y zUM#Xn)&`?Ijm+(uv#dwZ=VgBX>2o<>9Y-CbJb&P~=qNC#*hYendzm|6s zywm#_dOGE*fKS>fC9Mlx{aOCU{cUKDz$G|+16VZv!~b3AL!o)+lJ|W6I4|y_KStkH zhxF|y|AT#-64tky_#e(YCwd@}zL1K#b?ZdKak zEqro=w3%kK`K$bZUHZ=&rfNNB5U>TDJ*CHNi4s`8>iq$?>w2Q-f0oFU8S&Kh1b7e{ z*^GR8jNgBM>+H%$d5eB@-wznSzsGOU^}AS4Uqk+T3=uUrQU;`XEj*0^1`pLqCEV%iaeF%m2}DXS!h1|7Ba6S zUwc6S+kHIyp79*C*Ydt=lo5XIyq-Mp>q+2Q=F*t&8gb@1AJ_DCzHvToyzy;R@3;4J zow%&`MqoN*_9nUAMt$1^8t_G zO~y*YE3qRouccmMM+AUTa6xS275cZ|<=U>{8@l^aGe2vLrmIO~jd8%p|N9U)7Ke@n z>$xUlJ-3IvLU&rd*#B*pQwK8cucSXn-QP6om%hvmsY7BM{Db#0jM>Jgsx$uM13{+YMnZ5iK%=CwW&=UVGK@ub&Mexst~5RW?^o5c7V zj5cIWZZPVup=_#=E;zU<1P5ZK4bQs zbLNGNm7FsVnrWQB_ok8d&HO-#(dV1#v$S`@%)=gi(+x@T1H1-K>l6Jczu-QzLeTh`k*q7K~rm<(!mO|Pi?CF|m zX}`_Qlr;7NUoq3zdvqp~_KG90#!O?s(<`<&_BwxTrschxTPSJlufAlaHN2bKlt@}T z{`+QH@ZDUSq_HpkyqPBZ;0dJdbp&e7v@P%Dw#Acn(7`m-$4U18(_@uQjpqLv?5x9; zjYGkm(@a}c5Fk?CM$ric*K($(iack*eVvgeKIw%v>c%HsWVYlJAN!`Eq{Zb2j*$23 zX1dt4hLes>%WOkCuO(@ZfpxuH-G}07XZ*?>w@}j9 zUv*K=Y(w+_8;_jj5q}>kFSZq8G;S1q!Q=}v$IyQ^J}bBbhl=c3pff&Y;Iaf<_U4uE z_^-@0zRlp9@bcd8MqTAbU8SNuri&lvWm*l&rl$lX=>+;OL9F+I&Vh;p|}5o;rfhiJxo z-N!vH#1f9Qu{V%jUe*#CAG?tDzp6gmeO%w;7hP@f8_6^7psw@9YL_^uq8pxI-DTsB zg%o_a?8Fky!!|VmA1;ZFDq|;pTz|1Bt`hO(Vvpe{WlFxO94e$w3U45c%h*_P~Ff$7vGNZt&BTNyu|1Wa&9G?eV`(V zv8hJ5vJ#XLUhL*QaY}2~TE*Qxi*xm36t~#dO6iX`34as%+r`=VF6;J5GZ$~2REoac zZLOIkbpAGNgx|3xG+BY{7Wld-FZo&o7SbE4@r?_+BhkD|EbUqD%CIScEa*+)e0M2h zRyxH0R>JAY%U`2>sYPj)yC2Jl_gqJ8Tg^WKJP=>Q6N#<4f<1uBZv8w~l!EP9)z4#< z(_efOwELg%bLhMk{|38acNJB0&m-r54{{dN!TH|;&i`)Z{O{YG|2>$Ypa0!w#JKOm zWRex=>j*aKv)O52>z4>*a>T{~LhJ}cZsD!A$&16}ORl9p#VxBq5b-|@uZ zl=ZUENGx`ZGU{tyWWOtOaMHD9)LTUy(G~1H9fR(F&z*K>o+%)vXFjn#w`*}sWu8i` zm+Y$?%}c*!674NZEZ_B(jcUvYgrYovc?v};Ak;WZ?7psLQ#aBaMWL`{{ zce?SGJD&!MA9|E~e9Ug1Dy^Vkj#fC5rtbB|o=p5clrl+t766qKReM&gpHQrYD+?jB4@j zPt^AJ#lNAcW|V)+wHHlXvzNHF@QmN9=*&m{X2h*}z;6+{WbD1*OMDN?rs03_Eqod7 zf)0#2i6_(&EKzg!OjgA|eAjmB5T64t_nDM^4?DYR%Q^E*5o0-p`%;Y9)#zkC;Mcwf zhfR<+q8Q%>#xk9GVOOKtv%4iuA8`~`TMlh!??rr=XA{dln^^XB#Ii41_UYlQg*#Vi z@fto`w9HP-_VTOktCn=AZaKg5yn0{D3)K&_`~X{;JJ->Q@4)bbJh9xrbT!ZOY6{;+ z@tw0Xxk~GjYO8xae(L$`EsFh2=0rAo8|-@wr;XOEZt-QXY2&NmBM*FdYp1u>f{*K! zR%g-or#l~c{R!`z))r_cch6o$!v||l_6`gm4D|Z-^jrE{C^+4X|Euf~PF5BKT}p1V zq=_HpWjACsP5xTT>bsPVHM5kCweysYPiqu6_6=-JefI~}8+B>$R8p7CHNB~<=?QNn zj80 zwenJr)Hm3J9=PI3jo;~cn^@yHiMd~hAG5^VpTa()oDFmmb6?7b^TS%==i7-jQbqjy zbn@E5&S&RCzkyWzyNIFhB!<3M;hqIx8>p@-%R~O5;QoByKX~KpO6k|klL=jCfvyK#?0)ohB515jC-KHGVYKR8rX^tVHI~i)NS0rx4eCouXq*-LI(9n0d|3U6Y zdK#U;3tY$kh_4=RSBNaz&M0{nd=J2$NGKscIhi~CG@@)Qy0|xXYtfiHjOnw zsWbLRU6I_$+R6QH^slR?reFWO!9mS(ci1oJUzwa+hi0os+gI%&P5LdoyX<@Ue)~tn zh#{tanWdK4^7x7jLhpswp07`bQkc(Up)Gi|$ZNq}Cj7@7CcB`%3b8+piqGdnj?wDQZB0cCKMXR#U+_-$onJKOa#wPdHh*f#k zWFN5}0(-bm#s@#y2QMjAx85+P!{MLSp>P*W)eWW9+a}FPz#lz92{@{&Csi)AG*?C| zfjKFpr6_?)o+9*)3Z6E64yb#(cd}r_f`7)KK;#F7`5th_-X@uwGO^|Iec{qe03Up^>U4`M)~fA zulnGtTfoe%owa4%0O_wqQ@zfYQ`miXszFHb4= z@|2wU25YXb`KNI|{T%M)DdCw$xqaxMK6rEkc-#h$?m=g-LvDNFyCt+!MLVVRxtu=R z8CONdm3^D?MCK{us>rx5Vq94_mD68hQU`>O*cj7!^i$%0tBh+8@Gqy{7wJRoXr)== z#7KB()(gop)X2ud4ac zB)OxgiE~zRN6}}L*#}IO$h0Y!F(z8~!Ui z|7WDt^8I`^9Fxx{r{@!gj5Pyyv&?@88wGu`!%u|g^e_j@nS;&D!5z#&+d}&)zKNeY z>kRBTo1FEwGx^I|54Q*5KUGoseA~=?6Wn(}V_s-1lR24QQ#~p8-%4)qVI?i<&z<5f7&z8_oUygp4g??9yem4dEPW+@t16vBddZG7bEug+EpF#LFP@6d2@hyvy^!gWZnob zT*4!L6MiLgaz6KOeTVr{ioP^^H20b_Cmh&Ll8t$C0{)w4P4qQF!(IL6hrf4zT*3SZ zGCu+`kC-E6at@F=l21P*cHUFaq42FH_?Fnkg%)jR?5p5KF8SU3uzgke8ijbBHjnII z3M}QoGGCil37#vd=P6*UqR&qHY-0=*#z2|H{p=4b?v;#}lYZLRqdtcpQcn1V*oH!N zm(Y83BcR7mUq8FjU-D~oGZh`J?`|cLcitn)8%>_B!->-z&E=Lv!aM%ySom{I(Z^;!A~EB&I_S4 z+t6f}a^Ts{0R0g?R)J^O*z@jzXWP)PJ=je0@CD9h-7UVr>BQH}-X?qyJ_d~ti)0sP zc3h8IB3-Yk5BguPevozgMJ>;(7x`aPAM!sBkKV%5SpD}&ufeOIhfh~k|76mZg?Y_e zs=wy1*rs&Mp=<*&*@QNJc$>tFjday!3r~gjG6%chm%>A34O)p_KJRUK6zLitJ-mCO z6TL(D<5or4B(eWX7eD0RLVqN!@hq{zS!>x;owo|_Zb(vA$Q?$)H`xo+_-OcDJg+Y# zcCrCO9P765@4EiXI&0`0&zhkJ@%<9T0=+SzbMIg|-+j-t$?*jVI#i4~lo zsK9obhF`qc*klhvzHd?0Lz&E>22~j_ugHia(687-u(<~IVKY05y!4G^oo+=}72Z@M zu}u~CO~`Che>B$;roOoz*w!1cG?b6?4+PgXVu>FOJ&pC7R@?)I4Gx5erJK>NFIqznl0lPO^hDi0>8+FTbUm_hbq@a z)7RJ3h^cvMjPJ^;pQm5L+KKD3><1Y;>$$h8{rO8i;2m36fsLo z?*RGT86WXI+Q>J&?oQgw03TNLV->6|o=vG*9@EK@HY4^YPz+VY(U zg2(9gEbv%IJyW39*|Z5gcxtKVRt&yJa^JEi!o0sXdBFRYbH&~QPst1} z>~z|dP3hbb`t-AUymPVpVRYa42j-4GXA(R==UcHg!6o*j9KK83vSTqLU4fVs*T-5u z*+)wB{D^!_=qyuMM~N)Y%FyG{O=hg?h~ZnLCb^2N5n5cjwZP80Mvr|&9Mq}ogA`jM z+c#Mv+kMnsQLS`Lt5G@*5W}jP*u6Ex?!~`DI}^sav5qA?>#2Vnd|7<>8yWLj;`TN_ zpGLgmWNkm>NpLeCy?g;Oq|Z)r6S%z*98U(<1>ig%AN+Tlu6tJOBm;jl?IcIJQ{tl6 z`gnX*vCiXfvjtaPX#8Yv!n}WbhN8Bo5VzcBV_!m>FNy7Wk+s_X*>UjxZE!69rm^7C z2A(Syv4#Ntmm>Xd+0RI9^AulJ^~+lP`bgpyrqTDzt6kimy{NOCaZft7h;d8u457Tl zEiAPt>@6f|dsJIE+aose_!EnW3n6D|BxZfQ=XUabY>9VC+t)L`W#~;K(IcJ)&NA}0 zz+2^h`cXA2>Q|y`3a@Yw&B=04(YLQCBBu! zCai%5IAh%zfet;j=h5^w1%L;jxAiH0Tj&w~^6J1frZg}R#smR8qJly%Tv(k{=!oQ{oKS6ds z2|p2j%>721?7kQn<-6<`dcjd8d}E-z4(64}>V1Z+{uCK4>%l&|wcVr3?EZ93pETPV zcUE<1JPjBsxwCShHdJ`3DYH4)V90FC|G3O$6p;ZxUK@^*cOMXgw!!F`uii^;2c_A$mg)#1Ie z`XKAB7mzX8mKaUO)FC%wxx+pU{i#Be)v;Rr`>9uCH9CW99rs+)AFZw*XmTdjqoDVS ze69n=THpwk&yp5NU*{m7eaPo%fp}bx}|*EK%19aF0VU8TT76^uhLc|`Y?8~&I)8ObIIkRZc_#e zeq@}at#-f2V0-&cWbhmVKl_ovMQW61HucnMxUqY}@v-f_vD$gKCie6)A5d~_?>;x( z`R>o2$W(}p&U#4fzFnTA8JRX^!NV_iYI)yyT8Te;`+p;=b>9}TnJTgRUU6xn68Oo} z*m)mfkIt}*ieJmo+uzpq$4ik$N6*%kOt zBR)H;Khgb}AMVoMa_+O4y5$a&#vy&Ni<>?ftHmzvmNm~_#r=;3%8E}c$`8t}FKkV- zD|4a4VpGP4mh=8uFE^8YelO)l6!k9$k1O8h*X5z~XU(9h=?}arXZ`YX?fAp&dwp^< zb8K!8W%G$O^za5}eKFtF#}hO>J`B$9;D0x3SkEudYWJbopaWa=Lo8KoF7Ft{{bOL2 zF;IV=G(&7VFY;f@a}oD&v2QN-ZTji2d`r~uDl#tF(?&j#S37tgXP^JYLiXvTznt}5 z*DK57Jfo?jl5?n%_p!^d+e@AVW$sjP(tRZ1ac%tR+r#*bUjnSU42**E)Wj+N=Jo zKb$XxmHX5v_a9;9W_I_7vo5UM$40rIhQXQ9-5<_p!^*W8L>l-yfLiY4~%ld!^(Ak+#k*f zVdWMZmR_D>uR@w>+#|#(VwYYzZqj$SBu-n*k^C?{^{cU=Q-(6lZQs z**F!QsQSIWKJ0lBi66ZO>$eX4r zPvj5__}3QY3um6Q)t2nfNyeU=R-(*Z1B?M=oFD%od`HL2-hyqi;!f3kL%E~sDP@J+ zJ6(u>sDF&w+{Heh_(!P7Wbu#qGvD(nCQkHL67yS=%?@2QQ>Q7LW$i!bOZxUL>DyMl zA8U{+rTo|AFYC__X=9JbV%ihGjQjYudW$|Di^+Sp)XiRVnWFn86_dY-zS`88x#fJP z|8u?8+EkH$wYQ}tN2p)BCXeyCcY`yvku~O4^cQtSl7_ptU((;A^UR?h*0>vOH#!zH z5!0&;dC#3wt+s`hyOPwTYn^$8tycWQblDxx`Zvk5OJaV5kMY)g zlGyW$pk6b*o%ETT^s=IJ34H~dg&zBS*Uo;Y&nN8oy@lwLx1d+vjLqYwUf;fqSNrD4 zV(R#(R>%4Ewtw(lU8lGEHu?APUqL_KPg}BYA$||tdlmQX{4cB4{itpE>=6AYzu5Gub zUu(W>ZkFI&~F!WZzTM ziA}wEE%BFtOK_S$4V?17jsIGn5WQJwS-ur&ebMcCC&?#!r>A&p@Y;2FyVv%?JDTx- zn0CDtI&4WZ9qi>{|BF_NTba*CCoArc--^FV+Lt{z;@W8Yn-2CLkFoxdxm+sim-+e} ze)#FWxx4^aP6AixI;3g7z7AO}>lfhN3~ZUqUGZCtlX5Vdb5!~ z-Jdg3_Qwo&1fZyS(Q}{x@ze(UHy&HS(Yst!r?w56(%KVEVuh3!_ z{sl4At>p)P$)EpHg0?0QybqE(gC-9z(0Mq0GxCipXJnbFLx0KdIKe0z?vM~V-; zAH4k-8@cx(eca;9#Wyb1x0U_C`)2EDr>INtGXIAlA=9Qeak};`dOeDRjbnHuo@&247 z#wBR*U_b4jU|hi0csbW{3OVM552t8jlj3=wIz{GWBI`~VV-w*1MS)#pk3L4ky8w@A z6*&Wp(T{q^=ocEk5ot7!$8G+GRa)Mkhv0Rs1p-gu?zap&S-$klX9oAhUZaQEW<4D zA#y$spZRV0Vv3A+({7g)`Xs-M{loB%r-4!OZ)_ywzH%wCgAA9c}A60er|DQ7hGBdf5K)4u{B%qiXE`lP0rOhNz3j`xXtY}*k zpsl$88ZWIVm~hdC45%R}Pob5IRg+k(C@A#u5VUjLYpuQZ+H0@1_NoU4s$6K@W}H8!y{*`0|0FWr^P4lj zuze9UzG%L&bE!Qp(eWX^O&9F0v*F_Yrp?n_=xfB&T=263_`=L3?PapS%XcW_njR|C z1t0ttdCbK&&1#-pNm_jD^gWZ{#S`Jl+|ikL6+HUetb-HqGjiCrhR~Xmyw)1Sv%$00 z7{SiMt=0m@>}9OswLsslAgy(#o1K9*aikwG;{vaq{`UUkf6*OcM*X*DF(YQwJ9zH~$ zyNtIT1G;v03k>y*!`w{PvV&~q;T{|-OvsM8PY zx~(;zvJZvwZxBphaFQx5D!(5c+Iqfg{09B3{^Xr8HA`*?rqI?E@Se65b8Op7*bH5a zP3udV$J`mCaeQ)4O(XS}e~Wd5f6Z_4{9wzO)t}RM`F0@3T+x(b+45hZdecv}jds%q z*_z%-TlzLpHk#-8TT4Q1yZ+XOzx55lxujnQwi<`VBUrc+XJU71jA|Th)8C?-?e(jU z{ycE<%<8dDBSz!Grm|SN{xBpXf!E8QgSM7nU&Z{~1^v}w$4HFP8rd2z8q?3-V}ZMY zpY}zr>|6VN>cG$?N%egzRA1U`dkmt{G}Y&<`=(-0MCz06GQ8Cs-Cp0u7Q4QQ)FECW zJ2J^&O?h==o8;fgJh*^wiW4k-<9cxX9om(=8OghY^+P_M*mU)Z%BwR}`KyNWso$Cx z;ktDGGm7tKRG#oRWUA@IqThpG?1V?lfAp;Uq7B7g7i~C$7Hv%AKU~iu+OT9m@cJp^ z+IeHUTq+)Z_zB4vNwp1QxQ91Qda&NLub*jK?V}yh)?X=S(UxMeLtF2V7X7(Mi?-g- z_YiFAI3th_Ium`X+Em$tw5d8DggtY?!i${Y*Bzue0nNcLLtHxnP3_(k6t+84>+5xUyWonZ4n8_&Gv zcW@9kH%`_g`sO@yX0`Z4+BM;^5o3&X?etvi&p2BUe^}=8*Q6nDy5QGY><84>&-i}u z>M%_s*SO1aPw;NTHTK%5JXxIoH1n?du+gyI3GbopD=s3I5^2He17ave`}-6L4&)gy z56?JPRwv*u}6=Px>U5#0X# z*S<4u-?PukE8HHUzNxfhAnQ!zf7fO9_zY~f4Fh}T7Hs!U7{L_IbPmSZd?(ewCY!oa ze-r5r=)*!ywyuiyJP zoqE#eJdj(xiE|>(m8$Pskz1bg^ljIskK0<{-w_p{@-XrH3qcWAGQP5{4wJjG09-e6O-FPpfA@;{C<8}|*LKPQOYP+;%r zJNAEM7+X2>#djyRITIQj0A7GkuIwA|%`Co}xx^XZzIe*@Y-`(BiA~0c!jd5NF@a~y z_(0rV|H@5f&%m(4k-@k#cT}k^m3xJAzSuK&?4QD(CN_b-@NN<7qUwe=EnA=>bS@sA zhs_@n%wvw*XP6$J&c=t{P#io)-|*X;raaiXRUYNcf1TTCanaAzP#@EE9>iGP{14?n zg?9G9BP$rM#vfqs5<~m4fs17yqWD?Gd>bxU@LQK=lstw{0P(~3Kf^d)<+sD^+5F|AQq9S3a}IsBGYO2z#Q`b4oW2jDPXh-TIbpI%j}?Q`yqSoDEA4=DfJ{P|o3{ zhjWZ`GB!El7ymjd)s9Qt23&Wt=7YdX)yR=W~ru#4Wa@%FtK`aj43%mjNmzu6-6a0r^h3!bL z;LjRu!Cy9-b7-40Q0~!=4d@P6`40of)&PBxA2BkWb;oeH4wV;e^rWofH)Ed`5G^dn zUhP%NK0{f~a09=gEVN*i9mZH=`OPyu^#{_77TNhsrEE{^rxG1;f#YUkeH(TShw1C9 z#Bo2$Id|e>B|smbpOy_F zdI^vF{{fnr2hGfbX68XN^TK2LU!s|_+Wv2*nfm_%&D4Jt&1gP!Ml-XarN2uv+ZyMk z@yp^jn_n2-qM?J#6VZ^r3mR(1{wz#Ki#nkrH#|rDRy>Gxyck|JojEg2^E>_R0?Fwu z%)4I3*76%QZ{ql#&UbIe?|-tt>pkTyUg+Ujyg~QE58)@9re=7k{y(JO9p@x-vzOXX zf7CB8vN&y(q^VD;m${i@n$1377S3xBmsDju@OGc!!PexC{duh!EvY}xx?A(At8p~G zxh`4dtnU|Lo83?z@SVD&O8dqlo6lQ)nagvypRPUrmEKqUE9Gl2D=JSTJ|W?L3y$KG z0r0K5#Uqv11HX~3#{*9s0zcF}mih3*S#kbNMhE=n!v|-<2baTZgx@^)put$Y+@DB1 ziF(OjN3l8dh4`EB8g5_f=0w_$A-`;~3vVb09;E#Y@Yv*BccbyT-B;je!7bx-N=x(@ zNpFrG|75o@t>|iBAjVjfd#tT&rFYmAVmpWzy6bmf$2*z+JrH`H%X5uM%m?<%(7-fk zr(`+r4kCv}+mnRxE8GU?r{t&#bnV`Sp7SzHv$&9V8Lx0w!hZp}RN>u)EpT#ZZI8Aq zk!@Z&V>C{e?vH-o$ev{pbzXiOd+t;D`-{luUa+ugQemOu$&~1vA^V2>V6hQ=A<)*g zMe>}NbzAn*z`9p-U19t8bZefJS!=adcsAX|qD|SWr15h=>%(b}{YZ)8K1AZS0PFCx z#vZ1To%A7^u2n{O4CAINzaH6Grg@AlyYOKUjQ6nqhvQrH2c~88X*J_*yz#CeeQ9w| zFMFpH8}g#>R=tzg9p4G&j~l$c<=}o@#$8Tc0~kw(5iHT(Mf(%8c9~#{ZIMA7c8}3} z_wMe&=MAHG0Ngg{z4k-&b>9(mlJYkh%lPj&Q(DzjG(YG*U0UTiRa!N9WL;IC2IHwr z)BW49oOl@dc1x%o_k!MQ*JCT+R5Ug?b`Z9;gN)54G-I82(Izst)n=3QDzw|=K$eZM z`Ad_tzYkxfhNCwY29F|ZiRN}OCLgkv>>-iKELp27Ulr`?x2J-e+v&@q)%O0^!FVc2 zU-nqnepRA_{+eg}_v2sqNa+E+)@I&aoXGveA-u%#tUZ$(`Hem$wmSO9WH>#=Q}Dx* z9!B=F8BTZcT;#MXduYBS7f%Lvf_p0Who?JT*)H(p0 z)@v_TrQvgw28`1TMs|`qUL*=vmjF>4*PHO)v2q`p>H)qt;z?9oROH>d#~c3d(J zIKKpXN-@tZ_C>*<$(im04l!XEi~$C30|VBieS(4JbwK^0kMWFoSmC^23BQjRvtrJi zfX~|fxSD>%oz;&P`q2{VM+^NRHiy*@=%^Cji!QLgHReI|3;vzk+1Mvzm&g7hx7PH; zOs4(iH_Q#rT{vZJF}|#GSTBYb76m2K4K4HqYa8mTv^T)Fb~E$G+DnKAyP{9gvtmFE zDJ%#UHFyHP!t|i%wX6Jp&&F;tbef0kti8r?==K$OMK=DsCy8|sZO=V~@3-*%L%wgI zpVhz@I&b})*lXJ7>g@Z`TWo*C=dqu~me$%AT<$csUI47x;7Kb&0`dVd-|>Tn4;4VSk{2@QFGj7_esLywV%YN?WsYgR+Qfcf6SBdI zZuWkWH442&taauf-BsL=oAzx`pZezy_z$yZ@rCSp=2FM6ZYR1-Ue;bc1a}9kiW-oUO``l*es2Cc`hDMuDTYJUVYJTYEK&Xa^`~vqPxdpmBR3Y$ zVa7SXiRF|REFx|fcBsB1%q#KN8gSwRw?k$W1>tcG z*{r3Mou;xCp?+N*qV;ebm#)t2D;)lsNtAP$W!tru-gK+*DY{Aw$4jUN4=hZ z#=BqRL$?~*?G|SSb{O579V4&$;u!Z8wOP;CfAOyMd`|Pm5!Zh)8~U8m-MHdH{eq<{ zhZ_Esk0YBo;v9jje52uh>wZ~wJp_rF!;aNhjrjQwv`9d_LO==g5^=lv9TZY=nG-0btya%TIT^Rn0r zZY+3V+(7a<`F+6mUln{XZWehLvsc_$@Z>nb?%#mzBJ`rfzH2@Rp7N2EW1;_n-HghY zOfzP-(KDO74jN3xn3ifZ{K$xnd7QfL=l|dMzxb{>!Os^=Tl>L+#I-@zmF;vqL;)0&`-PYeI^2y#wE|^Ej9zSuQ(F2Zvo~X;Wr>&F%()qda=JX2b=W0rZX@&K0c5JjsF#2kps?in$w~2 zOZHw8c;6&#^lYw%u6xEh0|!ZGkQSXEcaEq%I>_HDUw}*Edj^gYPa`ufJ}`%N9$;+L zTYnYlo0u!{an68z1s&YmB^p0q==r8EKC+(8=0iL$fyU=R-#Pq#d{^npd!g~8oHl~qebJhpzT3M-8ZxRj(M}7;ep-Oje8OLKg{>tr+-j2q2OqQzOxEy$L%$f z0-|sEg?|227Pc(T=93q5$Mp&O{P+xO?QUncm?`wBg7SOuQ|nnUFL-d__tzd@c>dbM z@T4b5zXV@;tYCO>_-n6LT~bsO$0Spzcph8$DkNSHUknJ{O-tk_utJjMxYowL5D&xAMs$l}kJKzrA42Clla zw&P=)DB3TbKQy?5^*aWdKH`k?d5|OJ=P-G5&$UIYd#ovzzRcPOur6vJAlU&quvb6! zw317n#}4He=>1&_`knV(mb)LUm7S4bZ{-n83P`5}~#D$~F^ ziH=+{RiD~i%J?0|Xvs6$$LEnh``;}2a$h0s#3CCg1_=0V-HX0c`tKapV_;ZW%$ksA z##!>r`Lro{O7%z<7|7iXd@J6Ad>}r1wHa3*)`#CpUHGX49zwo|MHh}9G%yEvqx-I+ zUQ5o1K@X1JW=k>aIl7zT#^1M1ANsaWx=Bm_jT~UXMf(A**OGCi|Bj_^-o3Ss70JtRiPUo5K;$i9w z^9G-)swsYS8t6V&%r6eco2d=beXL+Ti8t?jR?kOyb^+J9Zli%c6W=|}(tTurL-kv_ zup`J#l3ByLlwpiP_Xg$^&JC*Ws|)4^_fW??(`D&aDv&E52t9wubG7LTP`&|~tOcA- z2e)VGbOc9Bw*ZXhs?87_3xT8bI>o%>zvUSJg5!t$YkygQo=OYk5{1)X|UvOdZ14 zSHSdYwR;v!ds?)aak}SOv>6T4Nw2%{-}TIRr?c(5(9>f=bj^^-QbS6BPM$u_GblTKIaSaybPV#0yCp~OubG|D& z)tp!T(R03ub1BXFuS=tv^I;m*od0j3(eCkq524YpPPHfsrhC2yOgoFUB3>ZfR1Ubm%R^{@t|!wYq%PG|8ydV`Oj+*lA~O>g=1&2`Ch*`JOfKl}Wa&z@YD zoGSe(_5jka{$&ofIu4_FuJqmLSzRt8k+@vN6_jxys}~g6^|=02{*I42CZ)Z+MtDQ_ zFuk6B7?MBX8wEG!2PYDTxSaiC6Ki2ted}umU-+uNW6!fPx}QgZpLCqiN$w(aH5q$| zt;)Y^LH>TPQMbh8f8gs)}bOFaI<#LT;;`)D6`yT4^-H^rv2b=`M^i!cs| z30cfuefm0Zvj<$LtP9vn2X2qm)vS4j{=hmj*SON4XTj$nvTLXCK_0Ml)*<+W;Ud1@ z4wv@6S+JyD;h1=+(+k0IA^P@Z;CL@^>TEn6?I*%|?M291&mq$(c3wGhO$=}ojE?pg zaA}d(eI7B;ii;S}!!gFFQslmeV}nIMip?&2>S-&eb2+-Xr`bpL zL@p!VN#JSrlGum#+JP*5a{sz_O7|HhgTR6G5t8MuzHeRf1IV>|@uPnOJ&xono!xMU zV=;2?cER>xe6>~nWgl^3USGCGwo(L|9aS#*k1;H#tiG@CzP#q?*H^3=MqieD_pD)` zTe+NA3i>uIaoL(z5|^(jMJ|g0CX&k@09G%X?riBOCnGD)W6e9x{6B$yGLgG@M+uPFCr`osnq+T7qVMm0e*<pqWBwEFC(P+#GB6iCKs2ya#$P zXeWbqI?|lphh_GT-*i6q^!=Xmj)Jqv$WZf~#NUxD1YBjykl<+CmoRwm8gvN_(p!{~ z-!S5{50QTm{rI7gP_Z<1@0tgVo`Fly@86PMwfAG z`+_}zk94WLT_HZTpJZn+!qU?R^DX$zPf! zFHx`RASR-3RHzOI`3u2YKJR5~m&LQju6=+PSc#@mfk#I;XkF9Xhb~Kou!iXT%yUDb zHMd1$#nAjq%%i;1JzL88ce4-ip<_A1I$wjmX13{SC{C<=i7RH^o$uxb~k7TbmV`9QGd!CulLd+x8yE&UVH3V5RhPtJfw`6kW%Q57~iKk2V zyG#SWZ6n4$%X`M!Tf`dA^lEf2PtFrR@9)1`yiwmL(w7X*3$3_O-Ipb&nyzfUj~d73 zB^}1`GPrNfC_^VqJpRyFmeXI(`m=`tv!{qJfDK6?z<7p?j5#kKoJPh0T&BR^8PDdc z>BCoz10QvJ4Cn^crzWSb)U>EME@DU3>)(IcLMflKJ;xf{i^jqcPx`U(F;sV*0 z9@`+6+Z|QK4HbcP*p3dOOffQe=^p>b`Q$gy8>mcdCOR?pQc5fThwMMaJJEyJ!#5k| zQCE&+1=bN4`#?AOO4$SY@i$cYj`Q?0bex}}d(l~QDQC;O7`y1r3%o>YT0`v^BT2Ql zClDJ5p6grK(Mz1@uPnc->$GXz$lR3A#?Fi@V1!huA z>_X?YQH>O!svAS3Yuoi`?7 z;Hzum9r3lt(~Lxwoy2@O(E#4y0VVLL9cE&&;+VA^G)lPdarzYMETBH|^_zHhT}Ui3 z(&DQ(lCCw)0DFDQuC3IJZQjUuh`CWaw~v3!4%1ugr`{O)rm?)*+IG46(Xs#O$Y)2P zUGZMU`J%oCa9oiA9F90EpksHv+I$Ln^1VGID49|9gmoe4wtRD;w@tuX=R0%JIk0wx z^da$sgxOY+S4;uRs?^VQJRKdKXX3fsW2PUN6PyS8m$$96jEN{ShS)?|(K z>(~i)tS@Yj(4@0v=AYJ*A%=f!=~koU80R^qocSMx7C&@4d^+=8M+_bx^Gx4mV=%lR zf6RfMM#&=jVW4y0L9FJP;EFqtYvE5N%U@rfoWeQAPUypi+fFOC$45@Xmtr`Ii-4Kd zoDoKRU?gyro@}?-GiEY0cO2N)@oeQ&`J!9Kq-?W!!O=5qS9Gg0rY$|+=(R2#yG3Zs z;MwSAPD@#3l%x)k;m8K>*|CZK?UHXE zSQvlaUaygOz#V7FzR`VGJzp9hZR~=7#4(0Me$x9tz#O`U-@Cwe9b;vUoxaZS6mI~( z?_$T-1}v8YtAUL9BIG;a68(>LW-a(8^nK`^MEKo^cZOMWa2U90A%?i>UWy(`y8Vj^ z-W~G3N|+4sE2dTkcY3La;!A4E@h3Fj@?I|h0d4h&v`y_Dvf z%IyZ1!%tcI$Sv>!3toc1Xftg4(i1z`r`$%O`Y72{uw%{gp}%j4nQVd6u2k=b_Lv-w9C6ZcNgs!U?;Ga_si~I zo?CNd$89?t*o_d=yD#n45wC6s?a8M9+*so4I?b9^`X60yGkBHmY8kv#d!gM<&eYTX z`)t!>mnQo(AMk~@on@OQcx>nn|GgRC*W(MHJqlVK(|pF48xnpR{9#R+tgM{xpg4Z+SqUxbt2$DbeA zP8>kBCz~bt94f}ZAC&KQ8@4}@|0nOi$2*NBx=)I~DLBh6Ed_Zmmb8ogj*B($Q+#a8 ziRlOLZcTfow{7p=)2#dr^$1P}dHxmS{*-a*K7~~1;gRv&&#=4q2+{B^Xhmfk$tSsa zLsYp(D0h-_yEvCTK-rVf{UYXNNcl#93Pbenf4h&KhplZT*bA8lR6kqJ8uR zD}4#;KJC4HSDzVPa4P-!PH=Ggo^0mUWaii;=GsK&+;{M0x(Xj6+m}gx6hY2Af zwW0IqUHcyIC2wLQRO{+y&1oy%Q;60Z^3v=xd@uAR-x}gEt}HbD&&G0Zixq$GzI!(< zUQzlb`^&QXzQy~DO~hlY+(aEafuU?xQyIS}*0OIT?ykFj5^#~;a1wiFXwllsOZNQY z=HCMwVx@=fmk@os;8!X1aTx3L4tRDG>u?Hdi3fWFWTbsP$fNh+^;@=@@tpmu@5euI zJloS~{Mf^}vY&J1smOzgtasWgzsnl0xB#9h7YD8-ZrRNZRe{^t%M<^%mAzqQDgCM@ zM!wqkWayOV^j_sAyRnr;pIf{zVeLhZ?%8VlapV5v;++=-q)WJ%JnOJcFt9JXsNmR` z9jxJ!aSA-a(fZzG$rar!`RW?l*Lrr~LZhUBGvGY4XLF2nNzBiB?2A6(+~Z=NXHuSc z$NRK)-f?&7%9)I%85;hKwRzzA8*(-flX^5~vsZ978^n(AZGJZ{d}Hkmh3Brlap9Y5 zXB75dd;P+GYrng&FZKv;RPE#(wr|KDVGw7v7h-ducZ+zQeST_AmfzHwZO+DX7L8*+ zW$CqsQ2#ndZ!5;~?T)1SKgT5n9%fEGPg^hCyL;^$H+j~+aIa_W>-*lUItd)>iO&{b zzpVKEw}))v^xXVe+m;MsK25=v#`B6-d%#3|54R)JS@0FSpM)=&z)^dPPp=sdJ!C-_ znar6#TJqE(V5sjs+Ioy0Dp)~h9|Efk*2Y=DN^5s2uo9e}o?p5$272fT4K$KI4$NlZ z3pADS3<7r3fLZ3kscR=JoVIov_AOJvYuanCRhhu!q1PI!2J$~pFfwj_RPO|%EMPPn z7-6@OGpqZeamRs?W#dPk2h6zUM(CaMllu7B_<(ExUxnUJaK}UoakzW#Yp5Cld=$T~ z9{O)aHe%0V*(>W==Y@g~XMkUVkLW_WhJF^^4h>9!Zi^e12bQy^n*x2#l}tfhP2`!w znUvlMo*u?8xnFzPt2s9c%ls>l`6c^gFh?cJc&YcR;7-2cIMxkxKKq7d4ylisG9*yU z_`&IGcItHJ`wjYP{bIqw~~L5btZ}(*8XPX|BODieY)C90smd$Iwp!n z(1W!K#{tHtvG|aGV$fw3Bewy!tF@x{ek3QOhxfi&l0C(w;bPjmH5mP)&vIb>i%$R!ND-Jnw zxCPVrK#mz3*locyF5m;EyQK>V!SrS7odir3pH94@jsBfWoxAYGZ{qm~ef7o>4;c8R z06*zr^v=gRyBiwNdEjK>0eE>vR;9jk zobD`Y93yLQfx&W;NnjtP#hGIxFw)1G$Ods#Mz#q7a#t}gnFVZ2u}*08-Hx^c@t zZ8C5Q+Z$TvP{_z}z)3LvXYBrbA=(q1M0Z->I`W~6e}cx`jG^&KqoxLU=zb}|!)w7J z3x8$ycC2sV{by=bFH0slvHHyF=yMIN=jDofwCJ2lH?YuINGfp*4P@^1(6H>x!}j$a z`W^l*8JzK~DuW+K=P}9Cl`Xvdh}E7e-#@k-eM|wd0CZMkKpRQWSHU@5-&LS>xq!PW zKJ9L7vE(=CLo%q3_U@z)ea$}gZ=D%mrt{V>6kkAb9VReu zqt}c-RoDGUuLGo_}8uDd!agR_!@Nx zHsuL6Y?6>$UEIamu}|L#)%R`w3y3`duW!ABy+kSf?U;95DDRbDv+e5GuWma%RNvsQ z(e?$QyytajyB{>FaZdEuZ5@GL(wT=Drr+|}wCKbA)uzQ`)y zbdFsfnYy*0SJ`$~0(W@ibAKZKl+C7H~l zJ^0XPffg3m+|bj-NWklU(r8j`h9}s#m5`q4()a_zEax1gEq^ujLK-ZNq4n|c{#Jy_S={4YBOowt=ZYVx1;IT^Pzry%G$AV zwyoR1V63w7fLXJR`hx6VchSzv;JoQ#?z<6xna%zgo=~Rz zn+SHU z`Wo;UO#M;tsP7COiRAga@L1A$d?3-Q=pt6*;<>Nrf_uqcfG$1{$t>^A;v4V6>CZ@? zJ?75isCTyZsV$rVR-NJ}y6=eFzkaFi@vPm*OQE%_GdWzoUyAo)=_a8U@w&Z?$Kr1X zl4gh}xZ!tNM_q=|>W0Uq#2Sh#XYr*ywD~gh^fL3LTC~l-=&_Ib_olO^mhwk0Hd=>J z-a8Xr>cx&4V(PcLRUhdi(5LLy6)*eX5@G`kA{I4ueo9$O7N)GeJ;}T1dt$*8;t!Y-Ha`&L;Uk+yt8rCK8~7!#JptuO^p9#c*bsc#*wEC>#lYyt|MbV#8~B* zm`8a(u@-lrZ&iJ_cT%6=!dlZQT>QVY;d1bI?Qr?G@n^$DWd)bZ`IqjxGo7{UTs{xU zwxU1ep6ye~-^6%#fosvu5&G>*_%TpxYRS#w1A z9MArbzHc04HXKIAypZ}d)&q>SKr{qxm0G;%Y#m=%x0k;q#2>e|kL^Lm);8YBKGOru zqi??_w&t``ai(0g!XbQMds`3a&cGMhjoy|2bpCY~t1%vR8kOH=4EnGAk8#}5i!a@h z3xYoSF1oF~I5ajVV~dQ3@m*oGu0L!vY#47g9GY!bel(M_5c;lpbc%7QZOx@+e}ZHn4>#Q&I;~@RmNS{PU zd+3i~iwtbh(LvIp%k__qv*uSdV^sfN<^Ab(iS{1hzvCIX=uG&jW}O$0?E}o7BcE*3 zIbZI;KeOm_CVhU%(q)xBX7?-YSMB|B(XVKELv^~B`nRP62f;fN8N)++yU*p0WNb-x zB71qYr)K}Z0$&{Px&7Z6*HGTABmW}uyVy^rkT`jD(be>%-s9BKY{mp+W03|tGzN`DeOF%TE_VQ{In>MjV-?s@JarH~?mF}b z&G=K6qcbVYNk_-Y9F8@%E<Svr=ou{i)c3)a@KgaFGk6x)afIv;2`&r}TV+ zGk1?vU>o#QD!Llcr4JeuyfprTcvrxKE~+EliEcZ-lOKV~$ad-=FuRy}*)fmwHPD*k zYcv!A@5#XXsA1~^RhG8U2XZ%12;Lpbf1UZfBme8oXXCyQ|GBSyJ||^;z4@HS{H)`y z-`(oFVbAAHq4~TkYCdlW&F6yt==>;?Mtt4yd}fZWl{)FYyV%F)0t*W?SJ>2F5w=!e{fFM{!h&5ORcr_Y@NaX#+=@r_x0v<{*UcB zZQk5Ir&BV&dQPK{wbtm0Bx6f>9o9N+t;3vcr=Od7w~saA8S(z8^)`TQ!aus+GBWc8z5|?*1Q`j}~nIfi-rw z<|F$$YmKe=8f$ELUD-pK&eq%i>b&c?UVnpiv*TLSRs7;${c>D{yd)m4|QP_cf%oN7_Xnc3AzmiZ;GYTei;Zi<@;G zWb4hk(pz0__*<_F>G3vDpY#*9uEw-=HR$K6*^k$-AD0gA^C%tOgUbIOW{rI3rNg_A zvfm3HNitgLp|6t#WJM`_Qztgw%SK58c{6>4{liL5MpbPMR8@(FiavPjWp+|DD_bVq(H+!M|P3Ypw z_ujtW)vzkCYOlX)66K_GBVTJ$NbeS{(~fR8y3N1PrrO$-`PDkS=(@V%BViqhbYz;p z(e1nx8k^cG{8sz8!um1Sa$}pTZijWIF%uqHz+CPMr;6vJb4clg-bFX?s~-q|o$E)1 zt0!sO{6@Qu;a^Ed>lkV%FCD`|tDYU`gKYXf0$q98m-*1QxSf`b>{B$APG8VtwN9j;F7;D=;k-uYC7(Dg zeMHFy`g|?1=nL4>>OK3J62(o`_k4I<(;)V{z@sN?c5n8jV4eE|}?Z3WUUN9X@`GdZ8n0}MAbWr}@He3((Zinmrz*Y3|*9Xt6 zmJUe$Q!HimBZhL(=efxi?ewnw==(MJx|iu<9|k<)`KtG<};~Q_b+v$jugUS9Hh-V zyJ%B=+4{G(E!7?1X=1yr^Zad}6GNY~c){*X>NC^YVfPVf!RL_>d}MR+7ULHle$Bu8 z`*mY8u=()}_1E|}m#y&<4|^teNtnR9^RuarFlx6Y2%j}Y!|0hP7`e~y03&E18b&(> zBWOCZZeuGFy*@<4?Lqo}Hr&4455cWZCvcmIUx?sV1l(Q=!EG7+%>B<{xv@BtKtXX4Iw!)kA+>Pg*#6iPe%;nPFzNVi6z??u)rW}|9Fl6!=ige7;_Ne&&d%eTV!!Lr8F#qj7y0Q!L z5txi`UZAgkOmyGyNvz$C&34`*qh&n(FTcva&E>AUv0!2Tb1@gayr!7v;;W2plNT8c zivOLr(AKwRW1Bn>8udVTE_|mn=2+mdJkwWS%)P^mn{j$#GScwzf|h*WG)j(MR*^jU z0wXaG`Z~m#b(HZari}KI`d9h}o)s5C^$)_1*SeqB()A|QuE4h|?k{%{CnT53mMSXo4j>>+V+*@NP`<%kwj2gm&)f9ZPb zIg{s^OE*~0vv{7hbffjWl;_z?f0fe>Ti5rx8MmB+&Cv%voVO4gs5W8g<2fVwAnZaB|+h5zo$B zIpO1ZTS-4W;j?-BM?5#LYQiV;R*_yc;nR6l$yGVeCa=u7Ejc%*A-OW=MDjy9Ba)}) zOifP6xfNUD*-M|y$>NvB&)|nl*)kJ6ql>rVFc+p7(~beZ0RM5|@9I9r7~s^f4*2W6 zU{#8IQ2bHb^hx;li58Y$RG-YbfJgX~@2PwWMQ@*A|JfP+iw;Gbhv1Q`nB$_u#%9h1 ztU0wS`F2O2K!}!e3!rP!az)Xd5jyUy&RFo)Jme2^j|?*BhHV^)gSaJ~x!jXEt+_pk z|5SV*=kaTT7Cb%hndUddWn2~mZKw0Di04@7aou{OZ?14sl>TVo4aL*d_^0gx)>DSiahhAGLy~LUP{RgqR^ClXV$N3c#Giy0N&4WtL z2QnVDW4gWTOsq`=Zo?c#_Cu+}8*&&i*#4L7hUVonW5B;OKaUK`oZCF)r8%+(a?z*G z$}|&i?I3mKfve1si;@pI(|m@}Eygg+n3P85j3poStesE2?_C6Jdeyxn-xuarlCi*f z?Gw|&4)yOB^S7I1pnJ;_mlUGTVfK*a_``I;13t9%sw?? z|KvDFcBAPC%>B{)=bAZh?Msz2|d6E10bGWC)_@cRYN%Xr_$?-!)+AzzX8pL$F7{f+aAFSsn{p6@iz%fA1h^*s68 zdOl%2|H68I$a-$GoE~^Z3$Fb3WjgaQ~+{OZlJ8FN|-5So{YI}0;eH(PC z7{Mo?F_k|t@}cAt&Jn)7tVi5M5OV;&Jd5%l!He&N#`eNT2gkc|UW1p4M*L@DBQ!OW z=P*qz<~dALkMSI)sXy`@rm6RM4%1YRw%7+&rYfPSSo*#)L{qWQ)GD5hA1_!L z3r!u5GqQ(sCRzzi9Yfyeil)Bt|6!V1{twVpEHss3Bv>?c#FM z96(I366_SF!~aGtgMZ?Om+iY~_nHdigZt2Lc=6q5O$k(^|0rdxf(Q08E-$~aBX1PH zyzdQch>_cr_enV79>f0T4fel2hmXIHj6}S%+M9osddXCNBl-2>my2v8ndi9? z>n&Ml%ZLq@tTU4Ll8v^G*l5W@38W=EJwM_xOIG@Ty9s_a;e&Y}^nWBLA^G8)5Bg6< z7Fv}v4H+pRc^c`2oF3gI6FmXXeFC2Q1U&bNoW0DCgCUuy4t^Gk+&u+3s2JWU7*xPF z=O8;G^AzWQ(l*_efsmD;@#SWmM{>I4@Ivp)$S!X70kOV`=Gpl3cem*+(_z!w#?j!P zJGGje&g`tzU2A3|&&Xfn(`%r+kk3XQw08)ZMDf=h%#$W`1zu>-tn&tvh*MDR=pB>7 zJlX}`T*%1|_^0wW6*dU_^4|f?uCDU z9PX%bxc|v4qN`vpSKm#tLn2IfjdD*LUDV={vFn9R@G$7E_uOS-b}bk(x2 z!A8uEkuP0No9?OO%wppCMx}W=Yrk;vKKE`_-|OuC@{8$#YL9=V58APLz^*lS(ig!V z-hsbVQge;)Ni2`8gLkb_e6C^OuN41k^bhca&UKxm+4HP&xa!vpWFG{-x&C9j|HQGW zeVskrYl?RKO#;DJ~r_Z`CVN4=> zH|Buys_ZQGSvak2sTug^HM`lz+56Q|*1q;~&bR4%Oj38_Ht8N~z9@aJ;v6H_3(P%< z$R&3U=(W|c4Em}_9{r)+$9~lBq(9Yz-?ZA_8EXF*wBLljH^|&*B9_%E{OZ-OgE3{f z59=PYC3Uv1Ffnus@D=U~Hu*|w^*dMqd7mQGLlsj$AUAf)f>d4sLj zI(faZD$j5>zlfcYWN~zm`#8hQ^#$=sB?k6Tp52s>XB{9WrZ0{?x4v_RQ0d~wnQ3z) zILRp}7<1qvqa+_#9)M4$@;|qmamAjU#@t`HqJ1{9ugm!&)oo&8Acx( zNvD5y?|%7qAMLR&nKjxYxi6FNg~WVypUPvO)&Ej94N3A%e!1Y{1kGjnK~^i!JpWS0)F8iT{ik3HV^G)2XL?-WU1;{sP~D6xT(5k3#CudnSVtomK877^ zVK@KELiS9Br?U1>G@JoXOWv5g&+NXr4(5$X;W?c#xcZbQ`~2yFA>G{p`8Eqq9<|T6 z==U3Wue$AccD9b)!@3yLpR*(478NB{B)2d>OB0BnNuOQZCz0WBHJ5Xaolbo1=yH~? z8+KL0?pwDe2mRUcr(!L*NGJ7LL*AGZg}06&E>Tf8Pv+e%z*REJMsSe`E*j{2OJT{F zEHlxQN4po2CzJK%MaFliaMqadro&Up`w6bhyBDE5d#GTa%2- z)&bk~z-8pU-L4(U`ZaBV>)Mgsjj~@PVfNG}gyf^rbWLY0}xkNuH(42=}GO3?oV9qsywTx*znO zk@js{|9IJiSFJwi9z*i4O1mvIzwk5DI+(J;2&N+!rUu(0`A)-c3JUGM7vh_kerGp$ zTYId+==Q?r_Xd46UrV@E?GI#Je_3{Bb-_*c{nt?$3UMZ)NBBPb+WQ zy4ddE*digN*spT13>2%M3qyo%qcn3?Ik zFSyDWyW^7!#_R~?ReQvKx6b;kdrXO4zQt*bzKp!0zjWrMi?h?F6wdF6<3S&{4uQ8< zBM%+n=n67qxXwy~srq1a~^<{==tD3%Y{%Q5IY0}yKWRJAv_s~z{#a;X6y?=sp$&2v= z(Kx@;UcPC()>ZM5_PdtD_bWF-pE^Sl%?e)J1#I2pdW^OdgCI=HGghfi(ZEMO``vGOr@7zpJTuy_FYQ-0 z@76uIFVc2-h}Tp^c+Dzn?*EQ&nIGHom+0mN(&DY`nOk-DIC1*|%=5}~=#Su(c3JNk zlJVN;gO%q3?p&Y^(X-_@!?#ka?@5+V^2pHhrTkm;mt~9X*N_%>xehw)u<$8>9P2htB_hX3r;%u%4*&c=!#@wu7vWpS!{zSt5olZGf5e7l zOF8*neQdcyaBI5Pb#02_DrO%vo!G*_<;#Be;q!8hBQwq(Q);X|M#VT<4BX9S_FOc6 zX3yWrq48>NImx5{QNX&qgKfY}WNXPln~&pf%w9`lC{ML{n(o<7#}~ocFMz+@-ge%i zem()*DuCzNatm;xj_Lt+9WKGlB^v1*&s95d;>FP39-eoYJ&PYhkMogpxKA-a!P#_d<1XI_eU(+&beB%M zx(Db(^vA!xp#Np11C5$F1C9BGwPsDR&)BZJ>9vM7LmQ3ssVltq0T1ez#-;H@kM}~x zd-|Se0b<`Y>F|L5s1Ya*y(l^(~mVKg0AD zH(~GW8wbqJI7=9>?jIv&wyW50PP*G5uj0o~1U^a72(;4rsms{1jJfB7Pk2q=wkG(L z#S7q{ntxyBp?!*vpd;*zhrZ5Q@O60T??39Ahr0Xw=U)yDc)>e&snv%2p2@y7A3BTX z^_}rq@#e00uyM1Ei-U_p{1^NT1|Rv0>~vb_z33{H_kzXx_iWr|zTb}9b3-^R3FFX- zoo>2~yPttO1AJ(25!p8a>-EqcI*rz}bN#FjJF8QTlsD=Q*>%r6++MeXx;yeMYd(ul zQQie!gp-0x+550IrKjy8WKOy#dLLyp+VyT|Y_Ip&sI%+sO`k4Y56wmRCsh~8Gwp4RU$UkZ=KZu9jo zwJADuu-A|+k7zNhJC$Fh+OB&m1i!c2+kUo_wk;XsZ@sPkpbNgQxthMG*9`a09b@!7 z@v~ktYI+!>lT3f>x-(`=HF~!`-Tkc>Uxw^uI7$vl5BCsz{^`|gUBpClVdn_!R}z;Z zn4jD=FL6NUrOEiE_w71Q>xbm&OP*d`=Q*J~y~q>ab)FBDC*B_0#1DE|dz`b@Negdh z+u>;JjeqPlBNm>hXV-_lW;A}@Hi|o_R_)BS=fo^z;k!udd(yF9GuXG+=sESJUNcO} zNniXd`v|32OY+wGs8h<`6MJ87(!ad%N|%X z&L~?vPB5x|0i1^D_4Nb2W)yH2*7Nl70Q9;G-R)M!bkC(Wy*l8}?eyB$qE|0%iC*nK zf0+)}Z|OCo0vzO@ZX5Ng3I4O%@voSb>qB_Yf3DYzCFDC8!ug^s8@F{6&c^wMt3tFe z!N&P3%q8Jm@}9<%y1CbkV(M{(WI)aDrNB$yCN|jgTR?2VQit}geQHPM8mpxH`w~sS z6I0=h!UufJl1r|n-j28t&hxvF_4NWU_{Y8$)int_|_e*EzgyNuTICA9G)cUkWH{1RD%s_CzbKKiTdJd3LB@>yBj z`APl4WfSGhnMUP$#@h2Q$dRO1A>aQQ_=&!ieu%W>e3PHvDer?Jz2@(yvA8w^$zxAE{ z%m(XyD9@4~1liAQVeSCyNwhf;Iqo~0dE0WFz0TNmbo?%x(l9*J9~<011>AT-xT%FU zH@w`Ao1LTupK$)njlh3+6#O@Y;6KQQ?I*L*EAflqfb*tj;F0;zl6jGxXCwQ&)7j89 z`Mv>6b?#!pnDiALVXQF^w&%cXV0`wRapKG1KyPQ(n&?-XO3QMSxWiI$KVL##OgDPR zxMJZ!(DJ+RX)ur^&g>rFZE{-&vkK! zd`CEo*1bEWoIxCNmaj?YKFV<0zr(g!bRVu$vT$en;Pf&0&W!MH?_;{N`-aBjGW&9_ z*{4`%j$wUu`Z)59k{-mJtvkmnsCyF68K$dPXES#H+ikEFi!{8y-R0;LQy$O#%d9Ow z#g6x14xv93{f!j;^|R=&=_=&0!t<^@n&lrmx#WUtC%YG}bh}e7OFy?1Il&Wfpm&;m zsd!m`XtXcBBvzc%)dk;T?vFb0E0^9 zW9-%$N`m=(;o*X><~Fiz zQ`A8pM=5>ndgP%y9?qS3-4nNoS4keoUtBgWfAJ!Ii}@|#w{)Bf+p~fjiTSgbxY+2g zRJM`!9Cz%sc)ffm@26h9Prb9(jE6(d{$HNm2l)Y>y2T{+Zs$IeCz;RTcsmzT$EVc$ z^Y8w#rs)&&*@EjH{&?bb?|oe3IJY@{;Y4D-XH{K!dSbvpCgHxZeR!&N;IWI_8Y5WD(ZlIo>gJ!X3Hx9@O54!u z5ca^W%ruP;6Wf3)L;YYyE>A0$iZS+w{EtF5Hk z!`FOyFDAN8O7*u+XC2kpWdpJk-Yj_7=kk5ncPCkKGyBXm8r&@h#uT=-jW*CrzfZlg zkH{bBZ@q&y4_WPKPuMO~ZkYPzc!g#ecSr!Ud`GWJJ;zzk7h2CA>v^>G+=FMAe=+Aj zu7L76m42-~-9~$^{3Vg^e^dHId-`*w%a%sIf1-54eUbEWrPsHoo0T4Mf8_fIO4qfg z4=X+OXOZs*lx}QK|A*4ImPfw7skE^ylHRZML+$BTl}@dQe6LsfnfCO*EA0UTb_VgU3NBm3Vdx6q*?dcyXJ@x02@A*nM zwx_?Z^sQ?m-)AUotc|3nEB#P=daBZ?zleOFqVzNE>4{4Fe;N5cLFw1p(|)D%AB}t; zr}T;T^cbbf)uQW`Dg^v-Dbdr@G8c7ef(&>@(7%P3D(pRax$4aM0(&t<0 z^CRiuR=Pjw{K+=%`{*0bhH20D#7Nqn^Kp^1J@4I0=P19+s;he>oouDeNP4K1J`G>9 z^MA`qwio-l_B~m5;U3e~6?9 zSn2JN^av}xRp}oqzm5CNk+hBbO_8*X`{ zjr&LRjps1#S4Pq{?jMMxZQNHVeVg*zxW7M=wsF5WlD2VwZzOHw{%)mzqVhKGe-cUC zxW6ruwsAjC>ARKR#(hyFZR7sOk+hBbS&_7j`+Q$88r7M)*#{H#{w2k}W zk+h9_UnFhgez4LHsJxB)fswS0`vH-(jr(NM9rZ1WY5B#?PGWF$V~>4yoPEh3k{u^r zckp9(x}Ug#_$VSbHS?|*x#@<5F>8Iuih0;ErpL>t)`5=2tUZQYvm!1tSVMj<`Mu;D z!aW_O*d-P%s#w$fiSg`HwT&NVU@JCbWciw7#Dy4x%%9@K=8iZ#t{(jZ1~JBdmt)8L zXyjZccGizM@H*rtUR^&R#l#(wU#A{ncdIxf)_Oh=dS3Zo6 zM1Je?`R#AXj{R#Nqy9SNMb(#1J#J*kK93tU);T?Uzp!uG3Gy8%x_k`2S2Zs5C{5U# z6gh}lZg`sg$j?UEU&qCiJ1AGk znO9S9+cp*7;%3DPpq?$!F-n7Z6Oi*255rM;dyXwHb}YAnv3+dqeR|iHhUCEBwC6f; zU`&DJz_OcyKcw%H10^#W=*+rmL;EDr#*hXNH4xD74>qTyzr2eAUA48b}_V3u#_3KI( zE8VO1O0MCy{?TP{exBf;@8YaH-LTHfYRluzV20jbm|0W)gi({Rz^qA6Wq+E?orCD; z*P-uUmt|~!n7&@enP@fp+JY;M?KS8Hyl$gc;kR_Jt}&{b@3#KHw!^9p=?`kV&>txF zVj=niSKK7U)vGKT$XzPfnn)_2Gr(lxRoxgeKw zP;e0~s|!D+1H!uOb{SsprK{Dsgkb(la3fq#9%%0;(=Yt8j&|1++g{<*Ylzztve%f2 zkEHM@_*v)B*1pTM?mTE@kEcC(6TT@0y^Q(Nxt5+WYow#sIo<`#E8#=Gbv-ysW}kRu zkbiz5d5=7mSySlKIWj-y?vWwrQ3fhjD|OIcbP)S)Ri7yn-uH86bCxZ~nh!XKq^$a( z_R1*d3h9t*C>uUs4C{gX-R-^D!S3z)kiNr>RkxIOepVs4T|+(j;JT|m%%=~X>6&k( zPU*a&VJSFD&mvo&C(v1eM7 zr#hzy&kb*%UXeI4Ue0RW%nkh5TZzZqT1fj|&c@Qs^ljetnOqHL)|3mTnGyS(V0t<< zna=&SOEWj6Pvv;Y2y`%mX58>iDR zyvpk`9Wh>frwRu5@M1U6TFN|mk^6An#^3?c4-Vu!)4S0-HA?FErgwGB=cRg=fc-D;ESpWrsJ!gK%i!Z>1Gv``8-!>* zSpHFa3}$ot7%~_`*;0G1W!`81Z{(bDEbqTeE1YAa3wDq2Z|{o^^nk;(^uMAF;?Bpo zM-U?vdYjB$==dQ_uK>s8=ssL&``47iD-Sq&7u!1Svw5KKe+c|P%-FVypZ^nlds!6U zu7JM2if^kg^C8MEyuqSKm1zH&~7yz@-oNqAL5Qj z=CbCocM z!q1I03}3g}*b9x;*fj2dMlUViqIxrsc{Y+RPD38zo9*bgNRQ50_iE7%eoooF zsei{I#!nts+Uph_mFH^B?UOB>m0xN-$CO{%`MRrEN1d(5%fNpHWru)^QqD03A=6Ce z-tP+P2~dAA@37699-xhIyPegO$C(0r%%a^p|1Z*RXMGFPZD-$%-8Ri`*xgRE|f9@)6-T{}L4yWZIbxQpgLk{6=W9r;Ud?$G{6 zY31Tbd(eva|EHB``LruO*BL#06|Jn_7UFN)+i7LYTy}?XMOm(x_0^kKV?6d&Yq(n*WvA|KPNfAeEwA1*8HbK z>+f&c;g|;;Q#oS@%Y;vbWWv3Z*!$)Eo_+n<@y8U?vm^i19F#Av#alUp#a7WegVp_> zhgcJKI0UP9JM>_legC84`stg&S@^4y?ftsFZ&ob6-nDn0Zd?5V-@|j>!<^4E`xZMn z_wky2W0t`yE8vxrdG|8yw6FJXSbQ3L?qGRvp&f56*pEl>#+tQeqxRmtYxBXIg-dXL z2QbyU@A1w%&geC8LBh3)*M;wSzs_)L*`1Q_Z2a~q7Jh}>(Uf$+E)Lxi*n)qPYCsY2>q9@^vUa;*mK|`a1XIw$1BdOtJY0_T+o{h zOSAZ8?D*8zzRbOoamJRHLwoW*rWvCy>=lU-9Ju9^b?|Z|Y!IS8f-iU=> zqUNpEm`kBabDV#r>L8|P$ZoN(wbxbN=>4Z;Y3V~+4l3xCC$w)S}grpwDAMpcMowA~J#6Cm69tQ7YP!V3#C{wH2)CQ%eF}qG(${u{#s2 zbpmc6V1ht?@6Y{yznRI9;M3pl_4^~Q$@i}3o_o%@=bn4+xxq$kN@I_3Z($2Eqpq)A z&)AOeZS{a7z16LKv+juJpewRZGd7N#pA6~R$E9R=>Qjm3IgEW-n6U{*+Orm8+tR%z zdk&-bz`?iid+wa+tyj4W=UhE@eA4~5F*emb%zMR)`PIA1df!g_)YZ(J*|R$S2k~`Z zqOM?%y<_e6Ypr(lgVj-*ADhcqX+NXV&TFoW=3PLZ_(9{+z4KMe>^nikpsW7hvv>N}XP%Ld9-~XnLzgT?uk{nhN46uu5!=3GHn+!DjqJ$P3_m?)5G7g>7e4?C>=bPW6zZ>>--IRgE*Uc%eff1 zn72T5A9U&*g4;3Rme?gTgy;VJKi|{e#59SUOJdn!kBgbh&Q(7AEBx491K7h8SvQlA zRlEhXYyh&#SMA>AaqobxNZ|ceX(A1KMsdfJtK zVxgaW=IdLZiGI?WG%%+FxhB~*h5Hxrv0MxA0h#-=%JuS{*batGV zR|eWAyc4jtz|bir?SqVOjc_&>`~C*{7VpLOt#N#GwcU5-T|>Fl{>xOjBZDI!rnFTKx@v=|FeL|DzIVn5V8R)Whk{yzgdE;e** zpYqkj{|^5#*+g4Od+C_&%wr>!-7y0{GSBB-zFue3r|i6T*<^EfS^CBZ^jgtG0Jn^(%62e-}ujf(;bgwNhdyd?{a75QO5KBQkzC(&(?Y> zdJ)aF(MO8&J)HGh`+#n^!mc3y!cST|VMF3^(#~7_?RMJJIQ}d+p_R6)Y~4=u>fWXN zTzRb3{u*2V3p-`P;OWE}cD=v3X|$Dirk%Ejw9Zw1kXeJFwIR^lP-rh18cacEr6RNX zAhTlPZZkKf%nf#zjyhjjd*oS9^_eC1oR!WzXLi{XVmPoiD_`%-wau_;re(TKLlNTS zmWFLv#JrmO8Icm&W3F`ur@5~ycD}*87hF6w-0`Qo;hfpJwx!mgb{L|plWt>GExxKJ{$y`tU27IdzKOSsc%sE6_s`QDphJpZc0C_I@Ug1kv zxQ%$Ig~-RF&=|gpMg9T4nJr!`KTKaumbK+>#)iC}pgg68(NjAoSRMD1uJ$fadw$+y zkOY9%vIuHP#?}}GP+Gjr8y$i7} zMZh_0)`1LYyplN!WI})Nb&hAhd2h~^6TA@wJi4zJ2Is}#NB(L0U%Z_o{3+Hr|Htx8 z0l3bhp3Xue*Td6u?6H3UU56Q$)r-D5Ok@A5#l3&KUgX(eqwd@YZ~vffF);U5w;y$- z>*hQ2R(uE8);in0}!r&9~+{qYWQa&Y>caeiQmJUsobS>U_7fiw1MP zg5C}vp^qJCWxYSK>?`o)EckOKd`kGEJ8xudxPi5ykI~UEadsnIT~R3|Ns#jkW(h)U0z}>|z6eVJc;G$M|FNv(X>?PW+Q>M~5)+ zPwuem2+n=y4Vm3Z*>O(2*0_59CY#??uX%2?-l%hj%sxoj^QhO9W5ZsO8-@Kc;LRXU zyfDwt`rK^it=?w;ir2D-R1(L^;vT=vbK0Y>ti%uf6{pXw_IfF~vlZNGT#a$?MMU?& z)_PkMwkerIX1`9k4E7Rl@vFVWUH6_`_f7u3!QTS@=JOXI-K_1<{j+HnMw*>q&UG<=8cdn`M?b#mS7{JqAX z=3977hR#G=<{O;O0;gTySynZHj||W!FFTPGa;<$@hV`r@mX@JIz^a-%G!s?`LEBZaMq(egEuAE9C+D7Oft;voCVA zAM(@>PNQ@ye%3wQn$z5?Kf-yad$0cNohR2By9@K9yX4Y)f?9Xr7eDvvt2O`3t>!P5 zkE%#t0B9*32b_&QlvQfaR&&VB-;F z?TTBhdhE$d@7?36U#k1`f{%FS?!Ed{jR&}Tqt(fx)n4w^Uq@Y+hL3)=5d2@wI>!Ba zhn_Sq0 zjoRvpp%eA>7WW!tLl(W2lGdB8e=&Jx|HHniUVKjZ!Fl*pFkle{ROS`J;m?Z^*sNI*6Y_p zy#P2E#h%5jSJP_OE7%vU*D?B3{|EVMSqVYu$(zT4_ZogBv+8U;`{1X<42*!U`k}JH zu|A^nhMxLphmPXQ=`7&bogQR}7a89DOh9{lz2huA)xfhl^WU#F zkfj-Xi*ARb_wk-o$2)wF{93U7Nnp{vAeV1Pu-}is%K`A`&k8*4pEj<_3IrRG?c=mp zZ^d472{M;B8@X+i6P^R-B|e=U@KeredjC!|JP&L5vB4v9veTB2d!|@x zd%wG9-_0FX(_9~5Jsj>CwqyUvsPFD9d~&(VcwifQFzrK$Tir3T#Hwz@H*$<*l;ihH zj8@~{+k$-Lyw3RZy8gdkZ%_R%iNBzE)_Keew9|-8zjXWAuZW)GWvP4jkG|GE zxg;vXYNpzJx|pBnZAZc=mq*UokNW8V+`@%Um|-2DARN|J==Y z$caf{{dDl`uT##ANzgjU-Zy3h?ecCM3eOZfy=n3wGnSuZ*}8&op>~^|A3Xai+7TVO zX^}S^e0RknNNE_@3$692Ep!p^p={tJ$Oa{#h!AhLQ8vU)K3_7L`oL)j-L5a+E=!*O2%_fCDhSLSVK zM^?*LFFsQHW?sN$oo{6OztEE(|8)6o-QRD6uX9P~{($jCWq*0Fg1f&*hjmG{PQA)CYl{4Z#A3S2soy8KN%cL!iizppv+`vJ3(?PmZuu+X`Z*YE z_g_pu^R4_4@<8`qHGaXX@e2=v`*v*9L1LiZ?ZSJjZAS@!!$8n#_Y?op|0w)^g_W

##*#%iA*7EMU%!JxX>!t&v`M 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 F&?hIeg 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 z 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

W5kXQkHKpWrg=qW{@Jbwf zdBIC&0+Mt<;X{SE{k*s*30NDl5|p z<-j6+*~717sy}F@R*njcsH4f^7CPzf+vG0u>h5)_GPSwgAgQ})Grb4I3+8JlQ7N%7 z2;*DsL;1DOQr6q%>d|hUeSD|NQ~aq$l_SZw6|=qDm^)@2BeoW~YN&*O z7DCE+!vrxz@~@u}*w|d&q@nubq{3_5=O)J|5FQUWzF)KvBD{zKac>1trl; z`7rF%Pb?_Qe1g!MGPX8lGYc_JWaL&IYFu~dBfmS8U6cL{Yg;WS(`~_(mV6zlzhE6M`w+zyB!}BVLeLcze)P>`MeR>1^pi^!RDc@(O`{b z4Q#vX2X%$Waj|=4rS(JDjDb?)qsg6>t)+=qGMtl}O0L{@auf_@6FSMA7kp_hOJ)(i zA(iF^iyil%kmgeJ&@TS;H~_accpE#--|!7$MNSmI)H_IGtIWqyc=FZ@;|9Fh3<5b8 zmT<)fn1mstFvuLU{4JJVS2O+Mpx`aWr|lsxW;#q8KjRxykk&jrrD=x5nXVlv7R=8y z3>1=Rb~YNHc3Q=|Z)BO2P>S4f5~~roNf3@Is#ptcircXH0xG!;tWjT_yB$pM2B-P@ zWb;J#f}z9ia*)KF+`Ezzl$$=4jB5>_#1Ox`m0`OcCeL8dupxme2fFfVO7VrG)Y86tiiUbqzVz1!}Vl9V2N^6fR>?R1{6-tpvK zsjnQ(%3tdg07eL~!OnQ4eLx`8Cb{AbY)-kl=4jx>RAr2Wu!I!yD6z8E=?cHru6nb2 zKW^2^jdQbmCQEDN4pYxl^KGu>=r(lh3UQX;(|TG4x>4`HNyQ|_2)TYuCegcDyS+Ng zdzR;OnQ`Ib78}L}U?cP?vMr2~oKY%y$ctDS;ksY7b}Y?~2&?5CFQF46LA>hjyX*D7?)42z2gAvt>_uPN zV+)GOuU~zWRA(EAK7o=$`Xg5nDlNYLfD?&qmEPA)m`^qf%$W*Xh=Z1K4ftFRzJ=>0 zrf#A*zFz+$d?ZlM0{r3YT2>DWS#lq1x3KM=s)-)#N-sQhTKp7?*W{1J|F`|m;Zy(B z-+%S@XYkGc@6XRlzE0kSFe@R9qFSw z9jR#yW$V%=4pNUI-}iTI>rI()(54ALgEm z6J^ii@!rvWM|6OcgDRwsmurBSUPLMf0%#)pB&}=`aLura9%~&lvw>MAyCyhxA?j7U zg`ukoJ1wxVmGhL)Rsm-&5_w} mArvrPy+^hBV&-$+@hXC_%2U=O>rz{tlsu`o7rz<5xcst+mv From 6f9f0539d0fa8312225e6d8c20c277681328e725 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:45:33 +0400 Subject: [PATCH 18/26] move config schema --- CONTRIBUTING.md | 2 +- package.json | 2 +- {schemas => src/000-config}/configSchema.json | 0 {bin => src/000-config}/test/fail.config.json | 2 +- {bin => src/000-config}/test/fail.tact | 0 {bin => src/000-config}/test/success.config.json | 2 +- .../000-config}/test/success.config.with.decompilation.json | 2 +- {bin => src/000-config}/test/success.tact | 0 8 files changed, 5 insertions(+), 5 deletions(-) rename {schemas => src/000-config}/configSchema.json (100%) rename {bin => src/000-config}/test/fail.config.json (75%) rename {bin => src/000-config}/test/fail.tact (100%) rename {bin => src/000-config}/test/success.config.json (79%) rename {bin => src/000-config}/test/success.config.with.decompilation.json (81%) rename {bin => src/000-config}/test/success.tact (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aa0ca6cf4..0f8bebd1e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -107,7 +107,7 @@ Tact uses the [meow](https://github.com/sindresorhus/meow) CLI arguments parser. The main entry point for the Tact CLI is [src/node.ts](./src/node.ts) and [src/pipeline/build.ts](src/010-pipeline/build.ts) is the platform-independent compiler driver which contains the high-level compiler pipeline logic described above. -The Tact CLI gets Tact settings from a `tact.config.json` file or creates a default config for a single-file compilation mode. The format of `tact.config.json` files is specified in [schemas/configSchema.json](./schemas/configSchema.json). +The Tact CLI gets Tact settings from a `tact.config.json` file or creates a default config for a single-file compilation mode. The format of `tact.config.json` files is specified in [schemas/configSchema.json](src/000-config/configSchema.json). The so-called "pre-compilation" steps that include imports resolution, type-checking, building schemas for high-level Tact data structures to be serialized/deserialized as cells (this step is dubbed "allocation") are located in [src/pipeline/precompile.ts](src/010-pipeline/precompile.ts). diff --git a/package.json b/package.json index 89972811f..432fda517 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "release": "yarn clean && yarn build && yarn coverage && yarn release-it --npm.yarn1", "type": "tsc --noEmit", "lint": "yarn eslint .", - "lint:schema": "ajv validate -s schemas/configSchema.json -d tact.config.json", + "lint:schema": "ajv validate -s src/000-config/configSchema.json -d tact.config.json", "fmt": "yarn prettier -l -w .", "fmt:check": "yarn prettier --check .", "spell": "yarn cspell --no-progress \"**\"", diff --git a/schemas/configSchema.json b/src/000-config/configSchema.json similarity index 100% rename from schemas/configSchema.json rename to src/000-config/configSchema.json diff --git a/bin/test/fail.config.json b/src/000-config/test/fail.config.json similarity index 75% rename from bin/test/fail.config.json rename to src/000-config/test/fail.config.json index 78579f791..1c0702197 100644 --- a/bin/test/fail.config.json +++ b/src/000-config/test/fail.config.json @@ -1,5 +1,5 @@ { - "$schema": "../../schemas/configSchema.json", + "$schema": "../configSchema.json", "projects": [ { "name": "fail", diff --git a/bin/test/fail.tact b/src/000-config/test/fail.tact similarity index 100% rename from bin/test/fail.tact rename to src/000-config/test/fail.tact diff --git a/bin/test/success.config.json b/src/000-config/test/success.config.json similarity index 79% rename from bin/test/success.config.json rename to src/000-config/test/success.config.json index 26d3ab935..805e329ae 100644 --- a/bin/test/success.config.json +++ b/src/000-config/test/success.config.json @@ -1,5 +1,5 @@ { - "$schema": "../../schemas/configSchema.json", + "$schema": "../configSchema.json", "projects": [ { "name": "success", diff --git a/bin/test/success.config.with.decompilation.json b/src/000-config/test/success.config.with.decompilation.json similarity index 81% rename from bin/test/success.config.with.decompilation.json rename to src/000-config/test/success.config.with.decompilation.json index 53d3ca3ac..2ffa1be35 100644 --- a/bin/test/success.config.with.decompilation.json +++ b/src/000-config/test/success.config.with.decompilation.json @@ -1,5 +1,5 @@ { - "$schema": "../../schemas/configSchema.json", + "$schema": "../configSchema.json", "projects": [ { "name": "success", diff --git a/bin/test/success.tact b/src/000-config/test/success.tact similarity index 100% rename from bin/test/success.tact rename to src/000-config/test/success.tact From 9dd0ef53cb37ca1b02a6af2bc1265469725b9db9 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:48:31 +0400 Subject: [PATCH 19/26] move grammar build script --- package.json | 3 ++- scripts/copy-files.ts => src/050-grammar/prev/copy.build.ts | 0 2 files changed, 2 insertions(+), 1 deletion(-) rename scripts/copy-files.ts => src/050-grammar/prev/copy.build.ts (100%) diff --git a/package.json b/package.json index 432fda517..17acd377e 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "clean": "rm -fr dist", "cleanall": "rm -fr dist node_modules", "build:func": "ts-node ./src/090-func/copy.build.ts", - "build": "tsc && yarn build:func && yarn node --no-warnings=ExperimentalWarning -r ts-node/register ./scripts/copy-files", + "build:grammar": "ts-node ./src/050-grammar/prev/copy.build.ts", + "build": "tsc && yarn build:func && yarn build:grammar", "test": "yarn gen:grammar && jest", "coverage": "cross-env COVERAGE=true jest", "release": "yarn clean && yarn build && yarn coverage && yarn release-it --npm.yarn1", diff --git a/scripts/copy-files.ts b/src/050-grammar/prev/copy.build.ts similarity index 100% rename from scripts/copy-files.ts rename to src/050-grammar/prev/copy.build.ts From 1923a7b3a59c0703f91bd12d95ceb9ab7df9caf9 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:52:03 +0400 Subject: [PATCH 20/26] move stdlib --- package.json | 1 - {stdlib => src/090-func/stdlib}/libs/config.tact | 0 {stdlib => src/090-func/stdlib}/libs/content.tact | 0 {stdlib => src/090-func/stdlib}/libs/deploy.tact | 0 {stdlib => src/090-func/stdlib}/libs/dns.fc | 0 {stdlib => src/090-func/stdlib}/libs/dns.tact | 0 {stdlib => src/090-func/stdlib}/libs/ownable.tact | 0 {stdlib => src/090-func/stdlib}/libs/stoppable.tact | 0 {stdlib => src/090-func/stdlib}/std/base.tact | 0 {stdlib => src/090-func/stdlib}/std/cells.tact | 0 {stdlib => src/090-func/stdlib}/std/config.tact | 0 {stdlib => src/090-func/stdlib}/std/context.tact | 0 {stdlib => src/090-func/stdlib}/std/contract.tact | 0 {stdlib => src/090-func/stdlib}/std/crypto.tact | 0 {stdlib => src/090-func/stdlib}/std/debug.tact | 0 {stdlib => src/090-func/stdlib}/std/math.tact | 0 {stdlib => src/090-func/stdlib}/std/primitives.tact | 0 {stdlib => src/090-func/stdlib}/std/reserve.tact | 0 {stdlib => src/090-func/stdlib}/std/send.tact | 0 {stdlib => src/090-func/stdlib}/std/text.tact | 0 {stdlib => src/090-func/stdlib}/stdlib.fc | 0 {stdlib => src/090-func/stdlib}/stdlib.tact | 0 {stdlib => src/090-func/stdlib}/stdlib_ex.fc | 0 23 files changed, 1 deletion(-) rename {stdlib => src/090-func/stdlib}/libs/config.tact (100%) rename {stdlib => src/090-func/stdlib}/libs/content.tact (100%) rename {stdlib => src/090-func/stdlib}/libs/deploy.tact (100%) rename {stdlib => src/090-func/stdlib}/libs/dns.fc (100%) rename {stdlib => src/090-func/stdlib}/libs/dns.tact (100%) rename {stdlib => src/090-func/stdlib}/libs/ownable.tact (100%) rename {stdlib => src/090-func/stdlib}/libs/stoppable.tact (100%) rename {stdlib => src/090-func/stdlib}/std/base.tact (100%) rename {stdlib => src/090-func/stdlib}/std/cells.tact (100%) rename {stdlib => src/090-func/stdlib}/std/config.tact (100%) rename {stdlib => src/090-func/stdlib}/std/context.tact (100%) rename {stdlib => src/090-func/stdlib}/std/contract.tact (100%) rename {stdlib => src/090-func/stdlib}/std/crypto.tact (100%) rename {stdlib => src/090-func/stdlib}/std/debug.tact (100%) rename {stdlib => src/090-func/stdlib}/std/math.tact (100%) rename {stdlib => src/090-func/stdlib}/std/primitives.tact (100%) rename {stdlib => src/090-func/stdlib}/std/reserve.tact (100%) rename {stdlib => src/090-func/stdlib}/std/send.tact (100%) rename {stdlib => src/090-func/stdlib}/std/text.tact (100%) rename {stdlib => src/090-func/stdlib}/stdlib.fc (100%) rename {stdlib => src/090-func/stdlib}/stdlib.tact (100%) rename {stdlib => src/090-func/stdlib}/stdlib_ex.fc (100%) diff --git a/package.json b/package.json index 17acd377e..9674eac27 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "dist/**/*", "src/**/*", "bin/**/*", - "stdlib/**/*", "!**/test", "!/docs" ], diff --git a/stdlib/libs/config.tact b/src/090-func/stdlib/libs/config.tact similarity index 100% rename from stdlib/libs/config.tact rename to src/090-func/stdlib/libs/config.tact diff --git a/stdlib/libs/content.tact b/src/090-func/stdlib/libs/content.tact similarity index 100% rename from stdlib/libs/content.tact rename to src/090-func/stdlib/libs/content.tact diff --git a/stdlib/libs/deploy.tact b/src/090-func/stdlib/libs/deploy.tact similarity index 100% rename from stdlib/libs/deploy.tact rename to src/090-func/stdlib/libs/deploy.tact diff --git a/stdlib/libs/dns.fc b/src/090-func/stdlib/libs/dns.fc similarity index 100% rename from stdlib/libs/dns.fc rename to src/090-func/stdlib/libs/dns.fc diff --git a/stdlib/libs/dns.tact b/src/090-func/stdlib/libs/dns.tact similarity index 100% rename from stdlib/libs/dns.tact rename to src/090-func/stdlib/libs/dns.tact diff --git a/stdlib/libs/ownable.tact b/src/090-func/stdlib/libs/ownable.tact similarity index 100% rename from stdlib/libs/ownable.tact rename to src/090-func/stdlib/libs/ownable.tact diff --git a/stdlib/libs/stoppable.tact b/src/090-func/stdlib/libs/stoppable.tact similarity index 100% rename from stdlib/libs/stoppable.tact rename to src/090-func/stdlib/libs/stoppable.tact diff --git a/stdlib/std/base.tact b/src/090-func/stdlib/std/base.tact similarity index 100% rename from stdlib/std/base.tact rename to src/090-func/stdlib/std/base.tact diff --git a/stdlib/std/cells.tact b/src/090-func/stdlib/std/cells.tact similarity index 100% rename from stdlib/std/cells.tact rename to src/090-func/stdlib/std/cells.tact diff --git a/stdlib/std/config.tact b/src/090-func/stdlib/std/config.tact similarity index 100% rename from stdlib/std/config.tact rename to src/090-func/stdlib/std/config.tact diff --git a/stdlib/std/context.tact b/src/090-func/stdlib/std/context.tact similarity index 100% rename from stdlib/std/context.tact rename to src/090-func/stdlib/std/context.tact diff --git a/stdlib/std/contract.tact b/src/090-func/stdlib/std/contract.tact similarity index 100% rename from stdlib/std/contract.tact rename to src/090-func/stdlib/std/contract.tact diff --git a/stdlib/std/crypto.tact b/src/090-func/stdlib/std/crypto.tact similarity index 100% rename from stdlib/std/crypto.tact rename to src/090-func/stdlib/std/crypto.tact diff --git a/stdlib/std/debug.tact b/src/090-func/stdlib/std/debug.tact similarity index 100% rename from stdlib/std/debug.tact rename to src/090-func/stdlib/std/debug.tact diff --git a/stdlib/std/math.tact b/src/090-func/stdlib/std/math.tact similarity index 100% rename from stdlib/std/math.tact rename to src/090-func/stdlib/std/math.tact diff --git a/stdlib/std/primitives.tact b/src/090-func/stdlib/std/primitives.tact similarity index 100% rename from stdlib/std/primitives.tact rename to src/090-func/stdlib/std/primitives.tact diff --git a/stdlib/std/reserve.tact b/src/090-func/stdlib/std/reserve.tact similarity index 100% rename from stdlib/std/reserve.tact rename to src/090-func/stdlib/std/reserve.tact diff --git a/stdlib/std/send.tact b/src/090-func/stdlib/std/send.tact similarity index 100% rename from stdlib/std/send.tact rename to src/090-func/stdlib/std/send.tact diff --git a/stdlib/std/text.tact b/src/090-func/stdlib/std/text.tact similarity index 100% rename from stdlib/std/text.tact rename to src/090-func/stdlib/std/text.tact diff --git a/stdlib/stdlib.fc b/src/090-func/stdlib/stdlib.fc similarity index 100% rename from stdlib/stdlib.fc rename to src/090-func/stdlib/stdlib.fc diff --git a/stdlib/stdlib.tact b/src/090-func/stdlib/stdlib.tact similarity index 100% rename from stdlib/stdlib.tact rename to src/090-func/stdlib/stdlib.tact diff --git a/stdlib/stdlib_ex.fc b/src/090-func/stdlib/stdlib_ex.fc similarity index 100% rename from stdlib/stdlib_ex.fc rename to src/090-func/stdlib/stdlib_ex.fc From b54d04bd439a3f21a4639628bb071a3e99e0760e Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 19:01:04 +0400 Subject: [PATCH 21/26] move pretty printer --- CONTRIBUTING.md | 2 +- src/{prettyPrinter.ts => prettyPrinter/index.ts} | 6 +++--- src/{test => prettyPrinter}/prettyPrinter.spec.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) rename src/{prettyPrinter.ts => prettyPrinter/index.ts} (99%) rename src/{test => prettyPrinter}/prettyPrinter.spec.ts (95%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0f8bebd1e..cf0d2d431 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -175,7 +175,7 @@ Some other codegen tests are as follows: ### Pretty-printer and AST comparators -The entry point to the Tact AST pretty-printer is [src/prettyPrinter.ts](./src/prettyPrinter.ts). It is going to be used for the Tact source code formatter once the parser keeps comments and other relevant information. +The entry point to the Tact AST pretty-printer is [src/prettyPrinter.ts](src/prettyPrinter/index.ts). It is going to be used for the Tact source code formatter once the parser keeps comments and other relevant information. The AST comparator is defined in [src/grammar/compare.ts](src/050-grammar/compare.ts). This is useful, for instance, for static analysis tools which can re-use the Tact TypeScript API. diff --git a/src/prettyPrinter.ts b/src/prettyPrinter/index.ts similarity index 99% rename from src/prettyPrinter.ts rename to src/prettyPrinter/index.ts index 5e3797906..ed835b216 100644 --- a/src/prettyPrinter.ts +++ b/src/prettyPrinter/index.ts @@ -1,6 +1,6 @@ -import * as A from "./050-grammar/ast"; -import { groupBy, intercalate, isUndefined } from "./utils/array"; -import { makeVisitor } from "./utils/tricks"; +import * as A from "../050-grammar/ast"; +import { groupBy, intercalate, isUndefined } from "../utils/array"; +import { makeVisitor } from "../utils/tricks"; // // Types diff --git a/src/test/prettyPrinter.spec.ts b/src/prettyPrinter/prettyPrinter.spec.ts similarity index 95% rename from src/test/prettyPrinter.spec.ts rename to src/prettyPrinter/prettyPrinter.spec.ts index c5e6af5e1..c781b7e84 100644 --- a/src/test/prettyPrinter.spec.ts +++ b/src/prettyPrinter/prettyPrinter.spec.ts @@ -1,8 +1,8 @@ import fs from "fs"; -import { prettyPrint } from "../prettyPrinter"; +import { prettyPrint } from "./index"; import { getParser } from "../050-grammar"; import { join } from "path"; -import { trimTrailingCR, CONTRACTS_DIR } from "./util"; +import { trimTrailingCR, CONTRACTS_DIR } from "../test/util"; import * as assert from "assert"; import JSONBig from "json-bigint"; import { getAstFactory } from "../050-grammar/ast"; From afc2589f4ff32069714d8de2e87cdb2f1b9312c0 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 20:19:07 +0400 Subject: [PATCH 22/26] split scripts --- .eslintignore | 4 +- .gitignore | 2 +- CONTRIBUTING.md | 16 +- cspell.json | 28 +- examples/examples.build.ts | 41 ++ examples/tact.config.json | 83 ++++ {src => examples}/verify.ts | 10 +- func/func.build.ts | 72 +++ jest.teardown.js | 3 - knip.json | 4 +- package.json | 12 +- scripts/prepare.ts | 99 ---- src/040-imports/path.ts | 3 + src/040-imports/stdlib.build.ts | 31 ++ .../stdlib/libs/config.tact | 0 .../stdlib/libs/content.tact | 0 .../stdlib/libs/deploy.tact | 0 .../stdlib/libs/dns.fc | 0 .../stdlib/libs/dns.tact | 0 .../stdlib/libs/ownable.tact | 0 .../stdlib/libs/stoppable.tact | 0 .../stdlib/std/base.tact | 0 .../stdlib/std/cells.tact | 0 .../stdlib/std/config.tact | 0 .../stdlib/std/context.tact | 0 .../stdlib/std/contract.tact | 0 .../stdlib/std/crypto.tact | 0 .../stdlib/std/debug.tact | 0 .../stdlib/std/math.tact | 0 .../stdlib/std/primitives.tact | 0 .../stdlib/std/reserve.tact | 0 .../stdlib/std/send.tact | 0 .../stdlib/std/text.tact | 0 .../stdlib/stdlib.fc | 0 .../stdlib/stdlib.tact | 0 .../stdlib/stdlib_ex.fc | 0 src/050-grammar/next/index.ts | 5 +- src/060-types/resolveAllocation.spec.ts | 7 +- src/060-types/resolveDescriptors.ts | 6 +- src/080-generator/builtins/global.ts | 14 +- src/090-func/bin.build.ts | 10 + src/090-func/pack.build.ts | 47 -- src/main.ts | 1 - src/node.ts | 6 +- src/prettyPrinter/prettyPrinter.spec.ts | 2 +- tact.config.json | 446 ------------------ {src => test}/benchmarks/benchmarks.spec.ts | 0 .../benchmarks/contracts/functions.tact | 0 {src/test => test}/codegen/all-contracts.tact | 0 {src/test => test}/codegen/empty-message.tact | 0 .../codegen/emptyMap-in-equality.tact | 0 .../test => test}/codegen/large-contract.tact | 0 .../codegen/map-uint-bool-get.tact | 0 .../codegen/message-opcode-parsing.tact | 0 .../mutating-method-on-non-lvalues.tact | 0 ...struct-field-func-keywords-name-clash.tact | 0 .../struct-field-storage-annotation.tact | 0 ...ruct-with-default-and-optional-fields.tact | 0 ...ar-scope-global-fun-shadowing-allowed.tact | 0 {src/test => test}/compare.spec.ts | 8 +- .../abi-global-errors.spec.ts | 0 .../const-eval-failed.spec.ts | 0 .../contract-duplicate-opcodes.spec.ts | 0 .../contracts/const-eval-ascii-empty.tact | 0 .../const-eval-ascii-overflow-2.tact | 0 .../contracts/const-eval-ascii-overflow.tact | 0 .../const-eval-div-by-zero-in-fun.tact | 0 .../contracts/const-eval-div-by-zero.tact | 0 .../const-eval-int-overflow-add-in-fun.tact | 0 .../const-eval-int-overflow-add.tact | 0 .../const-eval-int-overflow-div-in-fun.tact | 0 .../const-eval-int-overflow-div.tact | 0 .../const-eval-int-overflow-mul1-in-fun.tact | 0 .../const-eval-int-overflow-mul1.tact | 0 .../const-eval-int-overflow-mul2-in-fun.tact | 0 .../const-eval-int-overflow-mul2.tact | 0 ...-int-overflow-negative-literal-in-fun.tact | 0 ...st-eval-int-overflow-negative-literal.tact | 0 ...-int-overflow-positive-literal-in-fun.tact | 0 ...st-eval-int-overflow-positive-literal.tact | 0 .../const-eval-int-overflow-pow-1.tact | 0 .../const-eval-int-overflow-pow-2.tact | 0 .../const-eval-int-overflow-pow2-1.tact | 0 .../const-eval-int-overflow-pow2-2.tact | 0 .../const-eval-int-overflow-shl1.tact | 0 .../const-eval-int-overflow-shl2.tact | 0 ...l-int-overflow-struct-instance-in-fun.tact | 0 ...nst-eval-int-overflow-struct-instance.tact | 0 .../const-eval-int-overflow-sub.tact | 0 .../const-eval-int-overflow-ton1.tact | 0 .../const-eval-int-overflow-ton2.tact | 0 .../contracts/const-eval-invalid-address.tact | 0 .../contracts/const-eval-mod-by-zero.tact | 0 .../const-eval-rawslice-invalid.tact | 0 .../const-eval-rawslice-not-hex.tact | 0 .../const-eval-rawslice-overflow-padded.tact | 0 .../const-eval-rawslice-overflow.tact | 0 .../const-eval-repeat-lower-bound.tact | 0 .../const-eval-repeat-upper-bound.tact | 0 .../const-eval-shl-invalid-bits1.tact | 0 .../const-eval-shl-invalid-bits2.tact | 0 .../contracts/const-eval-unboxing-null.tact | 0 .../contract-duplicate-bounced-opcode.tact | 0 .../contract-duplicate-external-opcode.tact | 0 .../contract-duplicate-receiver-opcode.tact | 0 .../func-function-does-not-exist.tact | 0 .../scope-const-shadows-stdlib-ident.tact | 0 .../sha256-expects-string-or-slice.tact | 0 .../contracts/stdlib-skipBits.tact | 0 .../compilation-failed/func-errors.spec.ts | 0 .../compilation-failed/scope-errors.spec.ts | 0 .../compilation-failed/stdlib-bugs.spec.ts | 0 .../compilation-failed/tact.config.json | 0 {src/test => test}/compilation-failed/util.ts | 2 +- test/contracts.build.ts | 25 + {src/test => test}/contracts/attributes.tact | 0 {src/test => test}/contracts/case-1.tact | 0 {src/test => test}/contracts/case-2.tact | 0 {src/test => test}/contracts/case-3.tact | 0 {src/test => test}/contracts/case-4.tact | 0 .../test => test}/contracts/case-asm-fun.tact | 0 .../contracts/case-augmented-assign.tact | 0 .../test => test}/contracts/case-bin-ops.tact | 0 .../contracts/case-destructuring.tact | 0 {src/test => test}/contracts/case-if.tact | 0 {src/test => test}/contracts/case-initOf.tact | 0 {src/test => test}/contracts/case-loops.tact | 0 .../contracts/case-message-opcode.tact | 0 .../contracts/case-priority.tact | 0 .../test => test}/contracts/case-receive.tact | 0 {src/test => test}/contracts/case-traits.tact | 0 .../contracts/case-trycatch.tact | 0 .../getter-with-method-id-const.tact | 0 .../contracts/getter-with-method-id.tact | 0 .../contracts/native-functions.tact | 0 .../renamer-expected/attributes.tact | 0 .../contracts/renamer-expected/case-1.tact | 0 .../contracts/renamer-expected/case-2.tact | 0 .../contracts/renamer-expected/case-3.tact | 0 .../contracts/renamer-expected/case-4.tact | 0 .../renamer-expected/case-asm-fun.tact | 0 .../case-augmented-assign.tact | 0 .../renamer-expected/case-bin-ops.tact | 0 .../renamer-expected/case-destructuring.tact | 0 .../contracts/renamer-expected/case-if.tact | 0 .../renamer-expected/case-initOf.tact | 0 .../renamer-expected/case-loops.tact | 0 .../renamer-expected/case-message-opcode.tact | 0 .../renamer-expected/case-priority.tact | 0 .../renamer-expected/case-receive.tact | 0 .../renamer-expected/case-traits.tact | 0 .../renamer-expected/case-trycatch.tact | 0 .../getter-with-method-id-const.tact | 0 .../getter-with-method-id.tact | 0 .../renamer-expected/native-functions.tact | 0 .../__snapshots__/getters.spec.ts.snap | 0 .../local-type-inference.spec.ts.snap | 0 .../__snapshots__/structs.spec.ts.snap | 0 .../e2e-emulated/address.spec.ts | 0 .../e2e-emulated/allocation.spec.ts | 0 .../e2e-emulated/asm-functions.spec.ts | 0 .../e2e-emulated/bounced-routing.spec.ts | 0 .../e2e-emulated/constants.spec.ts | 0 .../e2e-emulated/contract-methods.spec.ts | 0 .../e2e-emulated/contracts/address.tact | 0 .../e2e-emulated/contracts/allocation.tact | 0 .../e2e-emulated/contracts/asm-functions.tact | 0 .../contracts/bounced-routing.tact | 0 .../e2e-emulated/contracts/constants.tact | 0 .../contracts/contract-methods.tact | 0 .../e2e-emulated/contracts/debug.tact | 0 .../e2e-emulated/contracts/deep-sequence.tact | 0 .../e2e-emulated/contracts/dns.tact | 0 .../contracts/external-fallbacks.tact | 0 .../e2e-emulated/contracts/getters.tact | 0 .../e2e-emulated/contracts/implicit-init.tact | 0 .../contracts/init-of-message.tact | 0 .../e2e-emulated/contracts/init-return.tact | 0 .../e2e-emulated/contracts/initof-2.tact | 0 .../e2e-emulated/contracts/initof-3.tact | 0 .../e2e-emulated/contracts/initof.tact | 0 .../contracts/integer-literals.tact | 0 .../e2e-emulated/contracts/intrinsics.tact | 0 .../contracts/local-type-inference.tact | 0 .../contracts/map-comparison.tact | 0 .../e2e-emulated/contracts/map-traverse.tact | 0 .../e2e-emulated/contracts/maps1.tact | 0 .../e2e-emulated/contracts/maps2.tact | 0 .../e2e-emulated/contracts/masterchain.tact | 0 .../e2e-emulated/contracts/math.tact | 0 .../contracts/mutating-methods.tact | 0 .../contracts/non-mutating-methods.tact | 0 .../e2e-emulated/contracts/optionals-2.tact | 0 .../e2e-emulated/contracts/optionals.tact | 0 .../e2e-emulated/contracts/ordering.tact | 0 .../e2e-emulated/contracts/random.tact | 0 .../contracts/receiver-empty.tact | 0 .../e2e-emulated/contracts/recursion.tact | 0 .../e2e-emulated/contracts/sample-jetton.tact | 0 .../e2e-emulated/contracts/semantics.tact | 0 .../e2e-emulated/contracts/send.tact | 0 .../contracts/serialization-2.tact | 0 .../contracts/serialization-3.tact | 0 .../e2e-emulated/contracts/serialization.tact | 0 .../e2e-emulated/contracts/stdlib.tact | 0 .../e2e-emulated/contracts/strings.tact | 0 .../e2e-emulated/contracts/structs.tact | 0 .../e2e-emulated/contracts/ternary.tact | 0 .../contracts/text-message-receivers.tact | 0 .../e2e-emulated/contracts/traits.tact | 0 .../e2e-emulated/contracts/try-catch.tact | 0 .../contracts/underscore-variable.tact | 0 {src/test => test}/e2e-emulated/debug.spec.ts | 2 +- {src/test => test}/e2e-emulated/deep.spec.ts | 0 {src/test => test}/e2e-emulated/dns.spec.ts | 0 .../e2e-emulated/external-fallbacks.spec.ts | 0 .../e2e-emulated/getters.spec.ts | 0 .../e2e-emulated/implicit-init.spec.ts | 0 .../e2e-emulated/init-of-message.spec.ts | 0 .../e2e-emulated/init-return.spec.ts | 0 .../test => test}/e2e-emulated/initof.spec.ts | 0 .../e2e-emulated/integer-literals.spec.ts | 0 .../e2e-emulated/intrinsics.spec.ts | 0 .../e2e-emulated/local-type-inference.spec.ts | 0 .../e2e-emulated/map-comparison.spec.ts | 0 .../e2e-emulated/map-traverse.spec.ts | 0 {src/test => test}/e2e-emulated/map1.spec.ts | 0 {src/test => test}/e2e-emulated/map2.spec.ts | 0 .../e2e-emulated/masterchain.spec.ts | 0 {src/test => test}/e2e-emulated/math.spec.ts | 0 .../e2e-emulated/mutating-methods.spec.ts | 0 .../e2e-emulated/non-mutating-methods.spec.ts | 0 .../e2e-emulated/optionals.spec.ts | 0 .../e2e-emulated/ordering.spec.ts | 0 .../test => test}/e2e-emulated/random.spec.ts | 0 .../e2e-emulated/receiver-empty.spec.ts | 0 .../e2e-emulated/recursion.spec.ts | 0 .../e2e-emulated/sample-jetton.spec.ts | 0 .../e2e-emulated/semantics.spec.ts | 0 {src/test => test}/e2e-emulated/send.spec.ts | 0 .../e2e-emulated/serialization.spec.ts | 0 .../test => test}/e2e-emulated/stdlib.spec.ts | 0 .../e2e-emulated/strings.spec.ts | 0 .../e2e-emulated/structs.spec.ts | 0 .../e2e-emulated/ternary.spec.ts | 0 .../text-message-receivers.spec.ts | 0 .../test => test}/e2e-emulated/traits.spec.ts | 0 .../e2e-emulated/try-catch.spec.ts | 0 .../e2e-emulated/underscore-variable.spec.ts | 0 .../exit-codes/compute-phase-errors.spec.ts | 0 .../contracts/compute-phase-errors.fc | 0 .../contracts/compute-phase-errors.tact | 0 .../exit-codes/contracts/repeat-range.tact | 0 .../tact-reserved-contract-errors.tact | 0 .../exit-codes/repeat-range.spec.ts | 0 .../tact-reserved-contract-errors.spec.ts | 0 {src/test => test}/rename.spec.ts | 10 +- test/tact.config.json | 372 +++++++++++++++ {scripts => test}/tsconfig.json | 0 {src/test => test}/util.ts | 0 {src/test => test}/utils/randomAddress.ts | 0 tsconfig.eslint.json | 3 +- tsconfig.json | 2 +- 263 files changed, 711 insertions(+), 665 deletions(-) create mode 100644 examples/examples.build.ts create mode 100644 examples/tact.config.json rename {src => examples}/verify.ts (89%) create mode 100644 func/func.build.ts delete mode 100644 scripts/prepare.ts create mode 100644 src/040-imports/path.ts create mode 100644 src/040-imports/stdlib.build.ts rename src/{090-func => 040-imports}/stdlib/libs/config.tact (100%) rename src/{090-func => 040-imports}/stdlib/libs/content.tact (100%) rename src/{090-func => 040-imports}/stdlib/libs/deploy.tact (100%) rename src/{090-func => 040-imports}/stdlib/libs/dns.fc (100%) rename src/{090-func => 040-imports}/stdlib/libs/dns.tact (100%) rename src/{090-func => 040-imports}/stdlib/libs/ownable.tact (100%) rename src/{090-func => 040-imports}/stdlib/libs/stoppable.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/base.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/cells.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/config.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/context.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/contract.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/crypto.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/debug.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/math.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/primitives.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/reserve.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/send.tact (100%) rename src/{090-func => 040-imports}/stdlib/std/text.tact (100%) rename src/{090-func => 040-imports}/stdlib/stdlib.fc (100%) rename src/{090-func => 040-imports}/stdlib/stdlib.tact (100%) rename src/{090-func => 040-imports}/stdlib/stdlib_ex.fc (100%) create mode 100644 src/090-func/bin.build.ts delete mode 100644 src/090-func/pack.build.ts delete mode 100644 tact.config.json rename {src => test}/benchmarks/benchmarks.spec.ts (100%) rename {src => test}/benchmarks/contracts/functions.tact (100%) rename {src/test => test}/codegen/all-contracts.tact (100%) rename {src/test => test}/codegen/empty-message.tact (100%) rename {src/test => test}/codegen/emptyMap-in-equality.tact (100%) rename {src/test => test}/codegen/large-contract.tact (100%) rename {src/test => test}/codegen/map-uint-bool-get.tact (100%) rename {src/test => test}/codegen/message-opcode-parsing.tact (100%) rename {src/test => test}/codegen/mutating-method-on-non-lvalues.tact (100%) rename {src/test => test}/codegen/struct-field-func-keywords-name-clash.tact (100%) rename {src/test => test}/codegen/struct-field-storage-annotation.tact (100%) rename {src/test => test}/codegen/struct-with-default-and-optional-fields.tact (100%) rename {src/test => test}/codegen/var-scope-global-fun-shadowing-allowed.tact (100%) rename {src/test => test}/compare.spec.ts (80%) rename {src/test => test}/compilation-failed/abi-global-errors.spec.ts (100%) rename {src/test => test}/compilation-failed/const-eval-failed.spec.ts (100%) rename {src/test => test}/compilation-failed/contract-duplicate-opcodes.spec.ts (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-ascii-empty.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-ascii-overflow-2.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-ascii-overflow.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-div-by-zero-in-fun.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-div-by-zero.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-add-in-fun.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-add.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-div-in-fun.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-div.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-mul1-in-fun.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-mul1.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-mul2-in-fun.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-mul2.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-negative-literal-in-fun.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-negative-literal.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-positive-literal-in-fun.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-positive-literal.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-pow-1.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-pow-2.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-pow2-1.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-pow2-2.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-shl1.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-shl2.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-struct-instance-in-fun.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-struct-instance.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-sub.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-ton1.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-int-overflow-ton2.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-invalid-address.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-mod-by-zero.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-rawslice-invalid.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-rawslice-not-hex.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-rawslice-overflow-padded.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-rawslice-overflow.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-repeat-lower-bound.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-repeat-upper-bound.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-shl-invalid-bits1.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-shl-invalid-bits2.tact (100%) rename {src/test => test}/compilation-failed/contracts/const-eval-unboxing-null.tact (100%) rename {src/test => test}/compilation-failed/contracts/contract-duplicate-bounced-opcode.tact (100%) rename {src/test => test}/compilation-failed/contracts/contract-duplicate-external-opcode.tact (100%) rename {src/test => test}/compilation-failed/contracts/contract-duplicate-receiver-opcode.tact (100%) rename {src/test => test}/compilation-failed/contracts/func-function-does-not-exist.tact (100%) rename {src/test => test}/compilation-failed/contracts/scope-const-shadows-stdlib-ident.tact (100%) rename {src/test => test}/compilation-failed/contracts/sha256-expects-string-or-slice.tact (100%) rename {src/test => test}/compilation-failed/contracts/stdlib-skipBits.tact (100%) rename {src/test => test}/compilation-failed/func-errors.spec.ts (100%) rename {src/test => test}/compilation-failed/scope-errors.spec.ts (100%) rename {src/test => test}/compilation-failed/stdlib-bugs.spec.ts (100%) rename {src/test => test}/compilation-failed/tact.config.json (100%) rename {src/test => test}/compilation-failed/util.ts (93%) create mode 100644 test/contracts.build.ts rename {src/test => test}/contracts/attributes.tact (100%) rename {src/test => test}/contracts/case-1.tact (100%) rename {src/test => test}/contracts/case-2.tact (100%) rename {src/test => test}/contracts/case-3.tact (100%) rename {src/test => test}/contracts/case-4.tact (100%) rename {src/test => test}/contracts/case-asm-fun.tact (100%) rename {src/test => test}/contracts/case-augmented-assign.tact (100%) rename {src/test => test}/contracts/case-bin-ops.tact (100%) rename {src/test => test}/contracts/case-destructuring.tact (100%) rename {src/test => test}/contracts/case-if.tact (100%) rename {src/test => test}/contracts/case-initOf.tact (100%) rename {src/test => test}/contracts/case-loops.tact (100%) rename {src/test => test}/contracts/case-message-opcode.tact (100%) rename {src/test => test}/contracts/case-priority.tact (100%) rename {src/test => test}/contracts/case-receive.tact (100%) rename {src/test => test}/contracts/case-traits.tact (100%) rename {src/test => test}/contracts/case-trycatch.tact (100%) rename {src/test => test}/contracts/getter-with-method-id-const.tact (100%) rename {src/test => test}/contracts/getter-with-method-id.tact (100%) rename {src/test => test}/contracts/native-functions.tact (100%) rename {src/test => test}/contracts/renamer-expected/attributes.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-1.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-2.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-3.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-4.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-asm-fun.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-augmented-assign.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-bin-ops.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-destructuring.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-if.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-initOf.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-loops.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-message-opcode.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-priority.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-receive.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-traits.tact (100%) rename {src/test => test}/contracts/renamer-expected/case-trycatch.tact (100%) rename {src/test => test}/contracts/renamer-expected/getter-with-method-id-const.tact (100%) rename {src/test => test}/contracts/renamer-expected/getter-with-method-id.tact (100%) rename {src/test => test}/contracts/renamer-expected/native-functions.tact (100%) rename {src/test => test}/e2e-emulated/__snapshots__/getters.spec.ts.snap (100%) rename {src/test => test}/e2e-emulated/__snapshots__/local-type-inference.spec.ts.snap (100%) rename {src/test => test}/e2e-emulated/__snapshots__/structs.spec.ts.snap (100%) rename {src/test => test}/e2e-emulated/address.spec.ts (100%) rename {src/test => test}/e2e-emulated/allocation.spec.ts (100%) rename {src/test => test}/e2e-emulated/asm-functions.spec.ts (100%) rename {src/test => test}/e2e-emulated/bounced-routing.spec.ts (100%) rename {src/test => test}/e2e-emulated/constants.spec.ts (100%) rename {src/test => test}/e2e-emulated/contract-methods.spec.ts (100%) rename {src/test => test}/e2e-emulated/contracts/address.tact (100%) rename {src/test => test}/e2e-emulated/contracts/allocation.tact (100%) rename {src/test => test}/e2e-emulated/contracts/asm-functions.tact (100%) rename {src/test => test}/e2e-emulated/contracts/bounced-routing.tact (100%) rename {src/test => test}/e2e-emulated/contracts/constants.tact (100%) rename {src/test => test}/e2e-emulated/contracts/contract-methods.tact (100%) rename {src/test => test}/e2e-emulated/contracts/debug.tact (100%) rename {src/test => test}/e2e-emulated/contracts/deep-sequence.tact (100%) rename {src/test => test}/e2e-emulated/contracts/dns.tact (100%) rename {src/test => test}/e2e-emulated/contracts/external-fallbacks.tact (100%) rename {src/test => test}/e2e-emulated/contracts/getters.tact (100%) rename {src/test => test}/e2e-emulated/contracts/implicit-init.tact (100%) rename {src/test => test}/e2e-emulated/contracts/init-of-message.tact (100%) rename {src/test => test}/e2e-emulated/contracts/init-return.tact (100%) rename {src/test => test}/e2e-emulated/contracts/initof-2.tact (100%) rename {src/test => test}/e2e-emulated/contracts/initof-3.tact (100%) rename {src/test => test}/e2e-emulated/contracts/initof.tact (100%) rename {src/test => test}/e2e-emulated/contracts/integer-literals.tact (100%) rename {src/test => test}/e2e-emulated/contracts/intrinsics.tact (100%) rename {src/test => test}/e2e-emulated/contracts/local-type-inference.tact (100%) rename {src/test => test}/e2e-emulated/contracts/map-comparison.tact (100%) rename {src/test => test}/e2e-emulated/contracts/map-traverse.tact (100%) rename {src/test => test}/e2e-emulated/contracts/maps1.tact (100%) rename {src/test => test}/e2e-emulated/contracts/maps2.tact (100%) rename {src/test => test}/e2e-emulated/contracts/masterchain.tact (100%) rename {src/test => test}/e2e-emulated/contracts/math.tact (100%) rename {src/test => test}/e2e-emulated/contracts/mutating-methods.tact (100%) rename {src/test => test}/e2e-emulated/contracts/non-mutating-methods.tact (100%) rename {src/test => test}/e2e-emulated/contracts/optionals-2.tact (100%) rename {src/test => test}/e2e-emulated/contracts/optionals.tact (100%) rename {src/test => test}/e2e-emulated/contracts/ordering.tact (100%) rename {src/test => test}/e2e-emulated/contracts/random.tact (100%) rename {src/test => test}/e2e-emulated/contracts/receiver-empty.tact (100%) rename {src/test => test}/e2e-emulated/contracts/recursion.tact (100%) rename {src/test => test}/e2e-emulated/contracts/sample-jetton.tact (100%) rename {src/test => test}/e2e-emulated/contracts/semantics.tact (100%) rename {src/test => test}/e2e-emulated/contracts/send.tact (100%) rename {src/test => test}/e2e-emulated/contracts/serialization-2.tact (100%) rename {src/test => test}/e2e-emulated/contracts/serialization-3.tact (100%) rename {src/test => test}/e2e-emulated/contracts/serialization.tact (100%) rename {src/test => test}/e2e-emulated/contracts/stdlib.tact (100%) rename {src/test => test}/e2e-emulated/contracts/strings.tact (100%) rename {src/test => test}/e2e-emulated/contracts/structs.tact (100%) rename {src/test => test}/e2e-emulated/contracts/ternary.tact (100%) rename {src/test => test}/e2e-emulated/contracts/text-message-receivers.tact (100%) rename {src/test => test}/e2e-emulated/contracts/traits.tact (100%) rename {src/test => test}/e2e-emulated/contracts/try-catch.tact (100%) rename {src/test => test}/e2e-emulated/contracts/underscore-variable.tact (100%) rename {src/test => test}/e2e-emulated/debug.spec.ts (97%) rename {src/test => test}/e2e-emulated/deep.spec.ts (100%) rename {src/test => test}/e2e-emulated/dns.spec.ts (100%) rename {src/test => test}/e2e-emulated/external-fallbacks.spec.ts (100%) rename {src/test => test}/e2e-emulated/getters.spec.ts (100%) rename {src/test => test}/e2e-emulated/implicit-init.spec.ts (100%) rename {src/test => test}/e2e-emulated/init-of-message.spec.ts (100%) rename {src/test => test}/e2e-emulated/init-return.spec.ts (100%) rename {src/test => test}/e2e-emulated/initof.spec.ts (100%) rename {src/test => test}/e2e-emulated/integer-literals.spec.ts (100%) rename {src/test => test}/e2e-emulated/intrinsics.spec.ts (100%) rename {src/test => test}/e2e-emulated/local-type-inference.spec.ts (100%) rename {src/test => test}/e2e-emulated/map-comparison.spec.ts (100%) rename {src/test => test}/e2e-emulated/map-traverse.spec.ts (100%) rename {src/test => test}/e2e-emulated/map1.spec.ts (100%) rename {src/test => test}/e2e-emulated/map2.spec.ts (100%) rename {src/test => test}/e2e-emulated/masterchain.spec.ts (100%) rename {src/test => test}/e2e-emulated/math.spec.ts (100%) rename {src/test => test}/e2e-emulated/mutating-methods.spec.ts (100%) rename {src/test => test}/e2e-emulated/non-mutating-methods.spec.ts (100%) rename {src/test => test}/e2e-emulated/optionals.spec.ts (100%) rename {src/test => test}/e2e-emulated/ordering.spec.ts (100%) rename {src/test => test}/e2e-emulated/random.spec.ts (100%) rename {src/test => test}/e2e-emulated/receiver-empty.spec.ts (100%) rename {src/test => test}/e2e-emulated/recursion.spec.ts (100%) rename {src/test => test}/e2e-emulated/sample-jetton.spec.ts (100%) rename {src/test => test}/e2e-emulated/semantics.spec.ts (100%) rename {src/test => test}/e2e-emulated/send.spec.ts (100%) rename {src/test => test}/e2e-emulated/serialization.spec.ts (100%) rename {src/test => test}/e2e-emulated/stdlib.spec.ts (100%) rename {src/test => test}/e2e-emulated/strings.spec.ts (100%) rename {src/test => test}/e2e-emulated/structs.spec.ts (100%) rename {src/test => test}/e2e-emulated/ternary.spec.ts (100%) rename {src/test => test}/e2e-emulated/text-message-receivers.spec.ts (100%) rename {src/test => test}/e2e-emulated/traits.spec.ts (100%) rename {src/test => test}/e2e-emulated/try-catch.spec.ts (100%) rename {src/test => test}/e2e-emulated/underscore-variable.spec.ts (100%) rename {src/test => test}/exit-codes/compute-phase-errors.spec.ts (100%) rename {src/test => test}/exit-codes/contracts/compute-phase-errors.fc (100%) rename {src/test => test}/exit-codes/contracts/compute-phase-errors.tact (100%) rename {src/test => test}/exit-codes/contracts/repeat-range.tact (100%) rename {src/test => test}/exit-codes/contracts/tact-reserved-contract-errors.tact (100%) rename {src/test => test}/exit-codes/repeat-range.spec.ts (100%) rename {src/test => test}/exit-codes/tact-reserved-contract-errors.spec.ts (100%) rename {src/test => test}/rename.spec.ts (81%) create mode 100644 test/tact.config.json rename {scripts => test}/tsconfig.json (100%) rename {src/test => test}/util.ts (100%) rename {src/test => test}/utils/randomAddress.ts (100%) diff --git a/.eslintignore b/.eslintignore index b22aef97e..a7e56e6ed 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,11 +2,11 @@ node_modules/ dist/ coverage/ **/output/ -src/test/**/output/ +test/**/output/ **/*.js **/grammar.ohm*.ts **/grammar.ohm*.js -src/grammar/next/grammar.ts +src/050-grammar/next/grammar.ts jest.setup.js jest.teardown.js /docs diff --git a/.gitignore b/.gitignore index 836605dd9..607ecdfc2 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,4 @@ dist output/ **/grammar.ohm-bundle.js **/grammar.ohm-bundle.d.ts -src/test/contracts/pretty-printer-output +test/contracts/pretty-printer-output diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cf0d2d431..5df7f550e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -139,7 +139,7 @@ Until we have the Tact type system specified, the only source of information abo - [src/types/test-failed](src/060-types/test-failed): negative well-formedness tests at the level of data types, contracts, traits and function signatures; - [src/types/stmts](src/060-types/stmts): positive type-checking tests at the level of function bodies; - [src/types/stmts-failed](src/060-types/stmts-failed): negative type-checking tests at the level of function bodies; -- [src/test/compilation-failed](./src/test/compilation-failed): negative type-checking tests that require full environment, for instance, the standard library (the other tests in `src/types` don't have access to the full environment). +- [src/test/compilation-failed](test/compilation-failed): negative type-checking tests that require full environment, for instance, the standard library (the other tests in `src/types` don't have access to the full environment). ### Constant evaluator @@ -149,9 +149,9 @@ The constant evaluator supports a large subset of Tact and handles, for instance The main logic of the constant evaluator can be found in the file [src/interpreter.ts](src/070-optimizer/interpreter.ts). -You can find the relevant tests in [src/test/e2e-emulated/contracts/constants.tact](./src/test/e2e-emulated/contracts/constants.tact) and the corresponding spec-file: [](./src/test/e2e-emulated/constants.spec.ts). +You can find the relevant tests in [src/test/e2e-emulated/contracts/constants.tact](test/e2e-emulated/contracts/constants.tact) and the corresponding spec-file: [](test/e2e-emulated/constants.spec.ts). -The negative tests for constant evaluation are contained in the Tact files prefixed with `const-eval` in the [src/test/compilation-failed/contracts](./src/test/compilation-failed/contracts) folder. +The negative tests for constant evaluation are contained in the Tact files prefixed with `const-eval` in the [src/test/compilation-failed/contracts](test/compilation-failed/contracts) folder. ### Code generator @@ -161,8 +161,8 @@ The code generator lives in the [src/generator](./src/080-generator) sub-folder The implementation that we have right now is being refactored to produce FunC ASTs and then pretty-print those ASTs as strings instead of producing source FunC code in one step. Here is the relevant pull request: . -One can find the end-to-end codegen test spec files in the [src/test/e2e-emulated](./src/test/e2e-emulated/) folder. The test contracts are located in [src/test/e2e-emulated/contracts](./src/test/e2e-emulated/contracts) subfolder. Many of those spec files test various language features in relative isolation. -An important spec file that tests argument passing semantics for functions and assignment semantics for variables is here: [src/test/e2e-emulated/semantics.spec.ts](./src/test/e2e-emulated/semantics.spec.ts). +One can find the end-to-end codegen test spec files in the [src/test/e2e-emulated](test/e2e-emulated/) folder. The test contracts are located in [src/test/e2e-emulated/contracts](test/e2e-emulated/contracts) subfolder. Many of those spec files test various language features in relative isolation. +An important spec file that tests argument passing semantics for functions and assignment semantics for variables is here: [src/test/e2e-emulated/semantics.spec.ts](test/e2e-emulated/semantics.spec.ts). Note: If you add an end-to-end test contract, you also need to include it into [tact.config.json](./tact.config.json) and run `yarn gen` to compile it and create TypeScript wrappers. @@ -170,8 +170,8 @@ Note: If you add an end-to-end test contract, you also need to include it into [ Some other codegen tests are as follows: -- [src/test/exit-codes](./src/test/exit-codes): test that certain actions produce the expected exit codes; -- [src/test/codegen](./src/test/codegen/): test that these contracts compile just fine without running any dynamic tests: bug fixes for FunC code generation often add tests into this folder. +- [src/test/exit-codes](test/exit-codes): test that certain actions produce the expected exit codes; +- [src/test/codegen](test/codegen/): test that these contracts compile just fine without running any dynamic tests: bug fixes for FunC code generation often add tests into this folder. ### Pretty-printer and AST comparators @@ -179,4 +179,4 @@ The entry point to the Tact AST pretty-printer is [src/prettyPrinter.ts](src/pre The AST comparator is defined in [src/grammar/compare.ts](src/050-grammar/compare.ts). This is useful, for instance, for static analysis tools which can re-use the Tact TypeScript API. -The corresponding test spec files can be found in [src/test](./src/test/) folder with the test contracts in [src/test/contracts](./src/test/contracts/) folder. +The corresponding test spec files can be found in [src/test](./src/test/) folder with the test contracts in [src/test/contracts](test/contracts/) folder. diff --git a/cspell.json b/cspell.json index 956f80712..4738b5970 100644 --- a/cspell.json +++ b/cspell.json @@ -150,8 +150,8 @@ "node_modules", "dist", "func", - "grammar/sample.json", - "src/generator/writers/writeStdlib.ts", + "src/040-imports/stdlib.ts", + "src/040-imports/stdlib/stdlib.fc", "src/050-grammar/grammar.ohm-bundle.d.ts", "src/050-grammar/test/items-native-fun-funcid.tact", "src/050-grammar/test/items-asm-funs.tact", @@ -159,19 +159,17 @@ "src/050-grammar/test-failed/funcid-*.tact", "src/050-grammar/next/grammar.gg", "src/050-grammar/next/grammar.ts", - "src/imports/stdlib.ts", - "/src/test/compilation-failed/const-eval-failed.spec.ts", - "src/test/e2e-emulated/address.spec.ts", - "src/test/e2e-emulated/intrinsics.spec.ts", - "src/test/e2e-emulated/optionals.spec.ts", - "src/test/e2e-emulated/strings.spec.ts", - "src/test/e2e-emulated/contracts/intrinsics.tact", - "src/test/e2e-emulated/contracts/strings.tact", - "src/test/e2e-emulated/contracts/dns.tact", - "src/test/compilation-fail/fail-const-eval.spec.ts", - "src/test/e2e-emulated/getter-names-conflict.spec.ts", - "src/test/exit-codes/contracts/compute-phase-errors.tact", - "stdlib/stdlib.fc", + "src/080-generator/writers/writeStdlib.ts", + "test/e2e-emulated/address.spec.ts", + "test/e2e-emulated/intrinsics.spec.ts", + "test/e2e-emulated/optionals.spec.ts", + "test/e2e-emulated/strings.spec.ts", + "test/e2e-emulated/contracts/intrinsics.tact", + "test/e2e-emulated/contracts/strings.tact", + "test/e2e-emulated/contracts/dns.tact", + "test/e2e-emulated/getter-names-conflict.spec.ts", + "test/compilation-failed/const-eval-failed.spec.ts", + "test/exit-codes/contracts/compute-phase-errors.tact", "/docs" ] } diff --git a/examples/examples.build.ts b/examples/examples.build.ts new file mode 100644 index 000000000..52b678287 --- /dev/null +++ b/examples/examples.build.ts @@ -0,0 +1,41 @@ +import fs from "fs"; +import { run } from "../src/node"; +import path from "path"; +import { glob } from "glob"; +import { verify } from "./verify"; +import { Logger } from "../src/010-pipeline/logger"; +import { __DANGER__disableVersionNumber } from "../src/010-pipeline/version"; + +const configPath = path.join(__dirname, "tact.config.json"); +const packagePath = path.resolve(__dirname, "output", "*.pkg"); + +// Read cases +void (async () => { + // Disable version number in packages + __DANGER__disableVersionNumber(); + + const logger = new Logger(); + + try { + // Compile projects + const compileResult = await run({ + configPath, + }); + if (!compileResult.ok) { + throw new Error("Tact projects compilation failed"); + } + + // Verify projects + for (const pkgPath of glob.sync(path.normalize(packagePath))) { + const res = await verify({ + pkg: fs.readFileSync(pkgPath, "utf-8"), + }); + if (!res.ok) { + throw new Error(`Failed to verify ${pkgPath}: ${res.error}`); + } + } + } catch (error) { + logger.error(error as Error); + process.exit(1); + } +})(); diff --git a/examples/tact.config.json b/examples/tact.config.json new file mode 100644 index 000000000..44b92c0b2 --- /dev/null +++ b/examples/tact.config.json @@ -0,0 +1,83 @@ +{ + "$schema": "http://raw.githubusercontent.com/tact-lang/tact/main/schemas/configSchema.json", + "projects": [ + { + "name": "echo", + "path": "./echo.tact", + "output": "./output" + }, + { + "name": "inheritance", + "path": "./inheritance.tact", + "output": "./output" + }, + { + "name": "large", + "path": "./large.tact", + "output": "./output" + }, + { + "name": "native", + "path": "./native.tact", + "output": "./output" + }, + { + "name": "maps", + "path": "./maps.tact", + "output": "./output" + }, + { + "name": "payouts", + "path": "./payouts.tact", + "output": "./output" + }, + { + "name": "external", + "path": "./external.tact", + "output": "./output", + "options": { + "external": true + } + }, + { + "name": "wallet", + "path": "./wallet.tact", + "output": "./output" + }, + { + "name": "wallet-opt", + "path": "./wallet-opt.tact", + "output": "./output", + "options": { + "experimental": { + "inline": true + } + } + }, + { + "name": "treasure", + "path": "./treasure.tact", + "output": "./output" + }, + { + "name": "multisig", + "path": "./multisig.tact", + "output": "./output" + }, + { + "name": "multisig-3", + "path": "./multisig-3.tact", + "output": "./output" + }, + { + "name": "increment", + "path": "./increment.tact", + "output": "./output" + }, + { + "name": "rugpull", + "path": "./rugpull.tact", + "output": "./output" + } + ] +} diff --git a/src/verify.ts b/examples/verify.ts similarity index 89% rename from src/verify.ts rename to examples/verify.ts index 95c6b5433..5fde96295 100644 --- a/src/verify.ts +++ b/examples/verify.ts @@ -1,10 +1,10 @@ import normalize from "path-normalize"; import { Cell } from "@ton/core"; -import { Config, Options } from "./000-config/parseConfig"; -import { ILogger, Logger } from "./010-pipeline/logger"; -import { PackageFileFormat, run } from "./main"; -import { fileFormat } from "./110-packaging/fileFormat"; -import { getCompilerVersion } from "./010-pipeline/version"; +import { Config, Options } from "../src/000-config/parseConfig"; +import { ILogger, Logger } from "../src/010-pipeline/logger"; +import { PackageFileFormat, run } from "../src/main"; +import { fileFormat } from "../src/110-packaging/fileFormat"; +import { getCompilerVersion } from "../src/010-pipeline/version"; export type VerifyResult = | { diff --git a/func/func.build.ts b/func/func.build.ts new file mode 100644 index 000000000..ef731f18f --- /dev/null +++ b/func/func.build.ts @@ -0,0 +1,72 @@ +import fs from "fs"; +import { decompileAll } from "@tact-lang/opcode"; +import { + FuncCompilationResult, + funcCompile, +} from "../src/090-func/funcCompile"; +import path from "path"; +import { Logger } from "../src/010-pipeline/logger"; +import { __DANGER__disableVersionNumber } from "../src/010-pipeline/version"; +import { stdlibPath } from "../src/040-imports/path"; + +const funcPath = path.join(__dirname, "..", "func"); + +// Read cases +void (async () => { + // Disable version number in packages + __DANGER__disableVersionNumber(); + + const logger = new Logger(); + + try { + // Compile func files + for (const file of fs.readdirSync(funcPath)) { + if (!file.endsWith(".fc")) { + continue; + } + + // Precompile + const funcFileFullPath = path.join(funcPath, file); + logger.info(`Processing ${funcFileFullPath}`); + let c: FuncCompilationResult; + try { + const stdlibFuncPath = path.resolve(stdlibPath, "stdlib.fc"); + const stdlib = fs.readFileSync(stdlibFuncPath, "utf-8"); + const code = fs.readFileSync(funcFileFullPath, "utf-8"); + c = await funcCompile({ + entries: [stdlibFuncPath, funcFileFullPath], + sources: [ + { + path: stdlibFuncPath, + content: stdlib, + }, + { + path: funcFileFullPath, + content: code, + }, + ], + logger, + }); + if (!c.ok) { + logger.error(c.log); + throw new Error( + `FunC compilation failed for ${funcFileFullPath}`, + ); + } + } catch (e) { + logger.error(e as Error); + logger.error(`Failed for ${funcFileFullPath}`); + throw e; + } + fs.writeFileSync(funcFileFullPath + ".fift", c.fift!); + fs.writeFileSync(funcFileFullPath + ".cell", c.output!); + + // Cell -> Fift decompiler + const source = decompileAll({ src: c.output! }); + fs.writeFileSync(funcFileFullPath + ".rev.fift", source); + } + } catch (error) { + logger.error(error as Error); + process.exit(1); + } +})(); diff --git a/jest.teardown.js b/jest.teardown.js index 6e3c204bf..78e6bc45e 100644 --- a/jest.teardown.js +++ b/jest.teardown.js @@ -7,7 +7,6 @@ module.exports = async () => { path.resolve(__dirname, "examples", "output", "*.boc"), path.resolve( __dirname, - "src", "test", "codegen", "output", @@ -15,7 +14,6 @@ module.exports = async () => { ), path.resolve( __dirname, - "src", "test", "e2e-emulated", "output", @@ -23,7 +21,6 @@ module.exports = async () => { ), path.resolve( __dirname, - "src", "benchmarks", "contracts", "output", diff --git a/knip.json b/knip.json index 1a0015ab0..bb3dadd49 100644 --- a/knip.json +++ b/knip.json @@ -9,9 +9,9 @@ ], "project": ["src/**/*.ts", "bin/tact.js", "bin/unboc.js"], "ignore": [ + "src/prettyPrinter/index.ts", + "src/030-error/display-to-json.ts", "src/050-grammar/ast.ts", - "src/prettyPrinter.ts", - "src/error/display-to-json.ts", "src/050-grammar/src-info.ts", "src/050-grammar/next/grammar.ts", ".github/workflows/tact*.yml" diff --git a/package.json b/package.json index 9674eac27..e0b4aee26 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,12 @@ "gen:grammar:old": "ohm generateBundles --withTypes src/050-grammar/prev/*.ohm", "gen:grammar:new": "pgen src/050-grammar/next/grammar.gg -o src/050-grammar/next/grammar.ts", "gen:grammar": "yarn gen:grammar:old && yarn gen:grammar:new", - "gen:pack": "ts-node src/090-func/pack.build.ts", - "gen:compiler": "ts-node ./scripts/prepare.ts", - "gen": "yarn gen:grammar && yarn gen:pack && yarn gen:compiler", + "gen:stdlib": "ts-node ./src/040-imports/stdlib.build.ts", + "gen:func-js": "ts-node ./src/090-func/bin.build.ts", + "gen:examples": "ts-node ./examples/examples.build.ts", + "gen:func": "ts-node ./func/func.build.ts", + "gen:projects": "ts-node ./test/contracts.build.ts", + "gen": "yarn gen:grammar && yarn gen:stdlib && yarn gen:func-js && yarn gen:examples && yarn gen:func && yarn gen:projects", "clean": "rm -fr dist", "cleanall": "rm -fr dist node_modules", "build:func": "ts-node ./src/090-func/copy.build.ts", @@ -26,7 +29,8 @@ "release": "yarn clean && yarn build && yarn coverage && yarn release-it --npm.yarn1", "type": "tsc --noEmit", "lint": "yarn eslint .", - "lint:schema": "ajv validate -s src/000-config/configSchema.json -d tact.config.json", + "check-config": "ajv validate -s src/000-config/configSchema.json -d", + "lint:schema": "yarn check-config test/tact.config.json && yarn check-config test/compilation-failed/tact.config.json && yarn check-config examples/tact.config.json", "fmt": "yarn prettier -l -w .", "fmt:check": "yarn prettier --check .", "spell": "yarn cspell --no-progress \"**\"", diff --git a/scripts/prepare.ts b/scripts/prepare.ts deleted file mode 100644 index a87d4a3e9..000000000 --- a/scripts/prepare.ts +++ /dev/null @@ -1,99 +0,0 @@ -import fs from "fs"; -import { decompileAll } from "@tact-lang/opcode"; -import { run } from "../src/node"; -import { FuncCompilationResult, funcCompile } from "../src/090-func/funcCompile"; -import path from "path"; -import { glob } from "glob"; -import { verify } from "../src/verify"; -import { Logger } from "../src/010-pipeline/logger"; -import { __DANGER__disableVersionNumber } from "../src/010-pipeline/version"; - -// Read cases -void (async () => { - // Disable version number in packages - __DANGER__disableVersionNumber(); - - const logger = new Logger(); - - try { - // Compile projects - const compileResult = await run({ - configPath: path.join(__dirname, "..", "tact.config.json"), - }); - if (!compileResult.ok) { - throw new Error("Tact projects compilation failed"); - } - - // Verify projects - for (const pkgPath of glob.sync( - path.normalize( - path.resolve(__dirname, "..", "examples", "output", "*.pkg"), - ), - )) { - const res = await verify({ - pkg: fs.readFileSync(pkgPath, "utf-8"), - }); - if (!res.ok) { - throw new Error(`Failed to verify ${pkgPath}: ${res.error}`); - } - } - - // Compile func files - for (const p of [{ path: path.join(__dirname, "..", "func") }]) { - const files = fs.readdirSync(p.path); - for (const file of files) { - if (!file.endsWith(".fc")) { - continue; - } - - // Precompile - const funcFileFullPath = path.join(p.path, file); - logger.info(`Processing ${funcFileFullPath}`); - let c: FuncCompilationResult; - try { - const stdlibPath = path.resolve( - __dirname, - "..", - "stdlib", - "stdlib.fc", - ); - const stdlib = fs.readFileSync(stdlibPath, "utf-8"); - const code = fs.readFileSync(funcFileFullPath, "utf-8"); - c = await funcCompile({ - entries: [stdlibPath, funcFileFullPath], - sources: [ - { - path: stdlibPath, - content: stdlib, - }, - { - path: funcFileFullPath, - content: code, - }, - ], - logger, - }); - if (!c.ok) { - logger.error(c.log); - throw new Error( - `FunC compilation failed for ${funcFileFullPath}`, - ); - } - } catch (e) { - logger.error(e as Error); - logger.error(`Failed for ${funcFileFullPath}`); - throw e; - } - fs.writeFileSync(funcFileFullPath + ".fift", c.fift!); - fs.writeFileSync(funcFileFullPath + ".cell", c.output!); - - // Cell -> Fift decompiler - const source = decompileAll({ src: c.output! }); - fs.writeFileSync(funcFileFullPath + ".rev.fift", source); - } - } - } catch (error) { - logger.error(error as Error); - process.exit(1); - } -})(); diff --git a/src/040-imports/path.ts b/src/040-imports/path.ts new file mode 100644 index 000000000..cf4666899 --- /dev/null +++ b/src/040-imports/path.ts @@ -0,0 +1,3 @@ +import path from "path"; + +export const stdlibPath = path.resolve(__dirname, "stdlib"); diff --git a/src/040-imports/stdlib.build.ts b/src/040-imports/stdlib.build.ts new file mode 100644 index 000000000..8ec0c34c9 --- /dev/null +++ b/src/040-imports/stdlib.build.ts @@ -0,0 +1,31 @@ +import fs from "fs"; +import path from "path"; +import glob from "glob"; +import { posixNormalize } from "../utils/filePath"; +import { stdlibPath } from "./path"; + +const fromPath = path.resolve(stdlibPath, "**", "*.@(tact|fc)"); +const toPath = path.resolve(__dirname, "stdlib.ts"); + +const stdlibFiles = glob.sync(fromPath, { windowsPathsNoEscape: true }); +const dirPrefixToRemove = posixNormalize(stdlibPath) + "/"; // Remove also the leading slash +let output: string = ""; +output = "const files: Record = {};\n"; +for (const f of stdlibFiles) { + let code = fs.readFileSync(f).toString("base64"); + const name = f.replace(dirPrefixToRemove, ""); + output += `files['${name}'] =\n`; + let first = true; + while (code.length > 0) { + if (first) { + first = false; + } else { + output += " +\n"; + } + output += ` '${code.slice(0, 128)}'`; + code = code.slice(128); + } + output += `;\n`; +} +output += "export default files;"; +fs.writeFileSync(toPath, output); diff --git a/src/090-func/stdlib/libs/config.tact b/src/040-imports/stdlib/libs/config.tact similarity index 100% rename from src/090-func/stdlib/libs/config.tact rename to src/040-imports/stdlib/libs/config.tact diff --git a/src/090-func/stdlib/libs/content.tact b/src/040-imports/stdlib/libs/content.tact similarity index 100% rename from src/090-func/stdlib/libs/content.tact rename to src/040-imports/stdlib/libs/content.tact diff --git a/src/090-func/stdlib/libs/deploy.tact b/src/040-imports/stdlib/libs/deploy.tact similarity index 100% rename from src/090-func/stdlib/libs/deploy.tact rename to src/040-imports/stdlib/libs/deploy.tact diff --git a/src/090-func/stdlib/libs/dns.fc b/src/040-imports/stdlib/libs/dns.fc similarity index 100% rename from src/090-func/stdlib/libs/dns.fc rename to src/040-imports/stdlib/libs/dns.fc diff --git a/src/090-func/stdlib/libs/dns.tact b/src/040-imports/stdlib/libs/dns.tact similarity index 100% rename from src/090-func/stdlib/libs/dns.tact rename to src/040-imports/stdlib/libs/dns.tact diff --git a/src/090-func/stdlib/libs/ownable.tact b/src/040-imports/stdlib/libs/ownable.tact similarity index 100% rename from src/090-func/stdlib/libs/ownable.tact rename to src/040-imports/stdlib/libs/ownable.tact diff --git a/src/090-func/stdlib/libs/stoppable.tact b/src/040-imports/stdlib/libs/stoppable.tact similarity index 100% rename from src/090-func/stdlib/libs/stoppable.tact rename to src/040-imports/stdlib/libs/stoppable.tact diff --git a/src/090-func/stdlib/std/base.tact b/src/040-imports/stdlib/std/base.tact similarity index 100% rename from src/090-func/stdlib/std/base.tact rename to src/040-imports/stdlib/std/base.tact diff --git a/src/090-func/stdlib/std/cells.tact b/src/040-imports/stdlib/std/cells.tact similarity index 100% rename from src/090-func/stdlib/std/cells.tact rename to src/040-imports/stdlib/std/cells.tact diff --git a/src/090-func/stdlib/std/config.tact b/src/040-imports/stdlib/std/config.tact similarity index 100% rename from src/090-func/stdlib/std/config.tact rename to src/040-imports/stdlib/std/config.tact diff --git a/src/090-func/stdlib/std/context.tact b/src/040-imports/stdlib/std/context.tact similarity index 100% rename from src/090-func/stdlib/std/context.tact rename to src/040-imports/stdlib/std/context.tact diff --git a/src/090-func/stdlib/std/contract.tact b/src/040-imports/stdlib/std/contract.tact similarity index 100% rename from src/090-func/stdlib/std/contract.tact rename to src/040-imports/stdlib/std/contract.tact diff --git a/src/090-func/stdlib/std/crypto.tact b/src/040-imports/stdlib/std/crypto.tact similarity index 100% rename from src/090-func/stdlib/std/crypto.tact rename to src/040-imports/stdlib/std/crypto.tact diff --git a/src/090-func/stdlib/std/debug.tact b/src/040-imports/stdlib/std/debug.tact similarity index 100% rename from src/090-func/stdlib/std/debug.tact rename to src/040-imports/stdlib/std/debug.tact diff --git a/src/090-func/stdlib/std/math.tact b/src/040-imports/stdlib/std/math.tact similarity index 100% rename from src/090-func/stdlib/std/math.tact rename to src/040-imports/stdlib/std/math.tact diff --git a/src/090-func/stdlib/std/primitives.tact b/src/040-imports/stdlib/std/primitives.tact similarity index 100% rename from src/090-func/stdlib/std/primitives.tact rename to src/040-imports/stdlib/std/primitives.tact diff --git a/src/090-func/stdlib/std/reserve.tact b/src/040-imports/stdlib/std/reserve.tact similarity index 100% rename from src/090-func/stdlib/std/reserve.tact rename to src/040-imports/stdlib/std/reserve.tact diff --git a/src/090-func/stdlib/std/send.tact b/src/040-imports/stdlib/std/send.tact similarity index 100% rename from src/090-func/stdlib/std/send.tact rename to src/040-imports/stdlib/std/send.tact diff --git a/src/090-func/stdlib/std/text.tact b/src/040-imports/stdlib/std/text.tact similarity index 100% rename from src/090-func/stdlib/std/text.tact rename to src/040-imports/stdlib/std/text.tact diff --git a/src/090-func/stdlib/stdlib.fc b/src/040-imports/stdlib/stdlib.fc similarity index 100% rename from src/090-func/stdlib/stdlib.fc rename to src/040-imports/stdlib/stdlib.fc diff --git a/src/090-func/stdlib/stdlib.tact b/src/040-imports/stdlib/stdlib.tact similarity index 100% rename from src/090-func/stdlib/stdlib.tact rename to src/040-imports/stdlib/stdlib.tact diff --git a/src/090-func/stdlib/stdlib_ex.fc b/src/040-imports/stdlib/stdlib_ex.fc similarity index 100% rename from src/090-func/stdlib/stdlib_ex.fc rename to src/040-imports/stdlib/stdlib_ex.fc diff --git a/src/050-grammar/next/index.ts b/src/050-grammar/next/index.ts index c7e8946fa..65acb2340 100644 --- a/src/050-grammar/next/index.ts +++ b/src/050-grammar/next/index.ts @@ -2,7 +2,10 @@ import * as $ from "@tonstudio/parser-runtime"; import * as A from "../ast"; import * as G from "./grammar"; import type { $ast } from "./grammar"; -import { TactCompilationError, throwInternalCompilerError } from "../../030-error/errors"; +import { + TactCompilationError, + throwInternalCompilerError, +} from "../../030-error/errors"; import { SyntaxErrors, syntaxErrorSchema } from "../parser-error"; import { AstSchema, getAstSchema } from "../ast-typed"; import { getSrcInfo, ItemOrigin } from "../src-info"; diff --git a/src/060-types/resolveAllocation.spec.ts b/src/060-types/resolveAllocation.spec.ts index f41a0689c..41c97aff0 100644 --- a/src/060-types/resolveAllocation.spec.ts +++ b/src/060-types/resolveAllocation.spec.ts @@ -9,9 +9,10 @@ import path from "path"; import { getParser } from "../050-grammar"; import { getAstFactory } from "../050-grammar/ast"; import { defaultParser } from "../050-grammar/grammar"; +import { stdlibPath } from "../040-imports/path"; -const stdlibPath = path.resolve(__dirname, "../../stdlib/std/primitives.tact"); -const stdlib = fs.readFileSync(stdlibPath, "utf-8"); +const primitivesPath = path.resolve(stdlibPath, "std/primitives.tact"); +const stdlib = fs.readFileSync(primitivesPath, "utf-8"); const src = ` trait BaseTrait { @@ -68,7 +69,7 @@ describe("resolveAllocation", () => { let ctx = openContext( new CompilerContext(), [ - { code: stdlib, path: stdlibPath, origin: "stdlib" }, + { code: stdlib, path: primitivesPath, origin: "stdlib" }, { code: src, path: "", origin: "user" }, ], [], diff --git a/src/060-types/resolveDescriptors.ts b/src/060-types/resolveDescriptors.ts index 9dbbcbed4..1dcf61c65 100644 --- a/src/060-types/resolveDescriptors.ts +++ b/src/060-types/resolveDescriptors.ts @@ -25,7 +25,11 @@ import { throwCompilationError, throwInternalCompilerError, } from "../030-error/errors"; -import { CompilerContext, Store, createContextStore } from "../010-pipeline/context"; +import { + CompilerContext, + Store, + createContextStore, +} from "../010-pipeline/context"; import { ConstantDescription, FieldDescription, diff --git a/src/080-generator/builtins/global.ts b/src/080-generator/builtins/global.ts index 4afde0897..674937599 100644 --- a/src/080-generator/builtins/global.ts +++ b/src/080-generator/builtins/global.ts @@ -1,15 +1,11 @@ import { Address, beginCell, Cell, toNano } from "@ton/core"; import { enabledDebug } from "../../000-config/features"; +import { writeAddress, writeCell, writeSlice } from "../writers/writeConstant"; +import { writeExpression, writeValue } from "../writers/writeExpression"; import { - writeAddress, - writeCell, - writeSlice, -} from "../writers/writeConstant"; -import { - writeExpression, - writeValue, -} from "../writers/writeExpression"; -import { TactConstEvalError, throwCompilationError } from "../../030-error/errors"; + TactConstEvalError, + throwCompilationError, +} from "../../030-error/errors"; import { evalConstantExpression } from "../../070-optimizer/constEval"; import { getErrorId } from "../../060-types/resolveErrors"; import { AbiFunction } from "./AbiFunction"; diff --git a/src/090-func/bin.build.ts b/src/090-func/bin.build.ts new file mode 100644 index 000000000..3cb709623 --- /dev/null +++ b/src/090-func/bin.build.ts @@ -0,0 +1,10 @@ +import fs from "fs"; +import path from "path"; + +const fromPath = path.resolve(__dirname, "funcfiftlib.wasm"); +const toPath = path.resolve(__dirname, "funcfiftlib.wasm.js"); + +// Pack func +const wasmBase64 = fs.readFileSync(fromPath).toString("base64"); +const wasmBase64js = `module.exports = { FuncFiftLibWasm: '${wasmBase64}' };`; +fs.writeFileSync(toPath, wasmBase64js); diff --git a/src/090-func/pack.build.ts b/src/090-func/pack.build.ts deleted file mode 100644 index 66852f42e..000000000 --- a/src/090-func/pack.build.ts +++ /dev/null @@ -1,47 +0,0 @@ -import fs from "fs"; -import path from "path"; -import glob from "glob"; -import { posixNormalize } from "../utils/filePath"; - -// Pack func -const wasmBase64 = fs - .readFileSync( - path.resolve(__dirname, "..", "src", "func", "funcfiftlib.wasm"), - ) - .toString("base64"); -const wasmBase64js = `module.exports = { FuncFiftLibWasm: '${wasmBase64}' };`; -fs.writeFileSync( - path.resolve(__dirname, "..", "src", "func", "funcfiftlib.wasm.js"), - wasmBase64js, -); - -// Pack stdlib -const stdlibFiles = glob.sync( - path.resolve(__dirname, "..", "stdlib", "**", "*.@(tact|fc)"), - { windowsPathsNoEscape: true }, -); -const dirPrefixToRemove = - posixNormalize(path.resolve(__dirname, "..", "stdlib")) + "/"; // Remove also the leading slash -let output: string = ""; -output = "const files: Record = {};\n"; -for (const f of stdlibFiles) { - let code = fs.readFileSync(f).toString("base64"); - const name = f.replace(dirPrefixToRemove, ""); - output += `files['${name}'] =\n`; - let first = true; - while (code.length > 0) { - if (first) { - first = false; - } else { - output += " +\n"; - } - output += ` '${code.slice(0, 128)}'`; - code = code.slice(128); - } - output += `;\n`; -} -output += "export default files;"; -fs.writeFileSync( - path.resolve(__dirname, "..", "src", "imports", "stdlib.ts"), - output, -); diff --git a/src/main.ts b/src/main.ts index c288257e2..570caea93 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,6 +14,5 @@ export { VirtualFileSystem } from "./020-vfs/VirtualFileSystem"; export { createVirtualFileSystem } from "./020-vfs/createVirtualFileSystem"; export * from "./browser"; -export * from "./verify"; export * from "./010-pipeline/logger"; export * from "./030-error/errors"; diff --git a/src/node.ts b/src/node.ts index 2c4f2f680..de390396b 100644 --- a/src/node.ts +++ b/src/node.ts @@ -5,6 +5,7 @@ import { createNodeFileSystem } from "./020-vfs/createNodeFileSystem"; import { build } from "./010-pipeline/build"; import { LogLevel, Logger } from "./010-pipeline/logger"; import { TactErrorCollection } from "./030-error/errors"; +import { stdlibPath } from "./040-imports/path"; type AdditionalCliOptions = { mode?: ConfigProject["mode"]; @@ -115,10 +116,7 @@ export async function run(args: { configWithRootPath.rootPath as string, false, ); - const stdlib = createNodeFileSystem( - path.resolve(__dirname, "..", "stdlib"), - false, - ); // Improves developer experience + const stdlib = createNodeFileSystem(stdlibPath, false); // Improves developer experience for (const config of projects) { logger.info(`💼 Compiling project ${config.name} ...`); let cliConfig = { ...config }; diff --git a/src/prettyPrinter/prettyPrinter.spec.ts b/src/prettyPrinter/prettyPrinter.spec.ts index c781b7e84..b16cd2f32 100644 --- a/src/prettyPrinter/prettyPrinter.spec.ts +++ b/src/prettyPrinter/prettyPrinter.spec.ts @@ -2,7 +2,7 @@ import fs from "fs"; import { prettyPrint } from "./index"; import { getParser } from "../050-grammar"; import { join } from "path"; -import { trimTrailingCR, CONTRACTS_DIR } from "../test/util"; +import { trimTrailingCR, CONTRACTS_DIR } from "../../test/util"; import * as assert from "assert"; import JSONBig from "json-bigint"; import { getAstFactory } from "../050-grammar/ast"; diff --git a/tact.config.json b/tact.config.json deleted file mode 100644 index 3453dd029..000000000 --- a/tact.config.json +++ /dev/null @@ -1,446 +0,0 @@ -{ - "$schema": "http://raw.githubusercontent.com/tact-lang/tact/main/schemas/configSchema.json", - "projects": [ - { - "name": "echo", - "path": "./examples/echo.tact", - "output": "./examples/output" - }, - { - "name": "inheritance", - "path": "./examples/inheritance.tact", - "output": "./examples/output" - }, - { - "name": "large", - "path": "./examples/large.tact", - "output": "./examples/output" - }, - { - "name": "native", - "path": "./examples/native.tact", - "output": "./examples/output" - }, - { - "name": "maps", - "path": "./examples/maps.tact", - "output": "./examples/output" - }, - { - "name": "payouts", - "path": "./examples/payouts.tact", - "output": "./examples/output" - }, - { - "name": "external", - "path": "./examples/external.tact", - "output": "./examples/output", - "options": { - "external": true - } - }, - { - "name": "wallet", - "path": "./examples/wallet.tact", - "output": "./examples/output" - }, - { - "name": "wallet-opt", - "path": "./examples/wallet-opt.tact", - "output": "./examples/output", - "options": { - "experimental": { - "inline": true - } - } - }, - { - "name": "treasure", - "path": "./examples/treasure.tact", - "output": "./examples/output" - }, - { - "name": "multisig", - "path": "./examples/multisig.tact", - "output": "./examples/output" - }, - { - "name": "multisig-3", - "path": "./examples/multisig-3.tact", - "output": "./examples/output" - }, - { - "name": "increment", - "path": "./examples/increment.tact", - "output": "./examples/output" - }, - { - "name": "rugpull", - "path": "./examples/rugpull.tact", - "output": "./examples/output" - }, - { - "name": "maps1", - "path": "./src/test/e2e-emulated/contracts/maps1.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "maps2", - "path": "./src/test/e2e-emulated/contracts/maps2.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "map-traverse", - "path": "./src/test/e2e-emulated/contracts/map-traverse.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "map-comparison", - "path": "./src/test/e2e-emulated/contracts/map-comparison.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "mutating-methods", - "path": "./src/test/e2e-emulated/contracts/mutating-methods.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "non-mutating-methods", - "path": "./src/test/e2e-emulated/contracts/non-mutating-methods.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "underscore-variable", - "path": "./src/test/e2e-emulated/contracts/underscore-variable.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "optionals", - "path": "./src/test/e2e-emulated/contracts/optionals.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "sample-jetton", - "path": "./src/test/e2e-emulated/contracts/sample-jetton.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "serialization", - "path": "./src/test/e2e-emulated/contracts/serialization.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "serialization-2", - "path": "./src/test/e2e-emulated/contracts/serialization-2.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "serialization-3", - "path": "./src/test/e2e-emulated/contracts/serialization-3.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "strings", - "path": "./src/test/e2e-emulated/contracts/strings.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "constants", - "path": "./src/test/e2e-emulated/contracts/constants.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "math", - "path": "./src/test/e2e-emulated/contracts/math.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "dns", - "path": "./src/test/e2e-emulated/contracts/dns.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "integer-literals", - "path": "./src/test/e2e-emulated/contracts/integer-literals.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "random", - "path": "./src/test/e2e-emulated/contracts/random.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "ordering", - "path": "./src/test/e2e-emulated/contracts/ordering.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "deep", - "path": "./src/test/e2e-emulated/contracts/deep-sequence.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "bounced-routing", - "path": "./src/test/e2e-emulated/contracts/bounced-routing.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "external-fallbacks", - "path": "./src/test/e2e-emulated/contracts/external-fallbacks.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "external": true - } - }, - { - "name": "debug", - "path": "./src/test/e2e-emulated/contracts/debug.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "send", - "path": "./src/test/e2e-emulated/contracts/send.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "intrinsics", - "path": "./src/test/e2e-emulated/contracts/intrinsics.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "masterchain", - "path": "./src/test/e2e-emulated/contracts/masterchain.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "try-catch", - "path": "./src/test/e2e-emulated/contracts/try-catch.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "address", - "path": "./src/test/e2e-emulated/contracts/address.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "ternary", - "path": "./src/test/e2e-emulated/contracts/ternary.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "implicit-init", - "path": "./src/test/e2e-emulated/contracts/implicit-init.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "recursion", - "path": "./src/test/e2e-emulated/contracts/recursion.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "local-type-inference", - "path": "./src/test/e2e-emulated/contracts/local-type-inference.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "benchmark_functions", - "path": "./src/benchmarks/contracts/functions.tact", - "output": "./src/benchmarks/contracts/output" - }, - { - "name": "benchmark_functions_inline", - "path": "./src/benchmarks/contracts/functions.tact", - "output": "./src/benchmarks/contracts/output", - "options": { - "experimental": { - "inline": true - } - } - }, - { - "name": "codegen", - "path": "./src/test/codegen/all-contracts.tact", - "output": "./src/test/codegen/output", - "options": { - "debug": true - } - }, - { - "name": "stdlib", - "path": "./src/test/e2e-emulated/contracts/stdlib.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "structs", - "path": "./src/test/e2e-emulated/contracts/structs.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "initof", - "path": "./src/test/e2e-emulated/contracts/initof.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "initof-2", - "path": "./src/test/e2e-emulated/contracts/initof-2.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "initof-3", - "path": "./src/test/e2e-emulated/contracts/initof-3.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "getters", - "path": "./src/test/e2e-emulated/contracts/getters.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "allocation", - "path": "./src/test/e2e-emulated/contracts/allocation.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "traits", - "path": "./src/test/e2e-emulated/contracts/traits.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "receiver-empty", - "path": "./src/test/e2e-emulated/contracts/receiver-empty.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "init-of-message", - "path": "./src/test/e2e-emulated/contracts/init-of-message.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "init-return", - "path": "./src/test/e2e-emulated/contracts/init-return.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "repeat-range", - "path": "./src/test/exit-codes/contracts/repeat-range.tact", - "output": "./src/test/exit-codes/contracts/output" - }, - { - "name": "semantics", - "path": "./src/test/e2e-emulated/contracts/semantics.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "contract-methods", - "path": "./src/test/e2e-emulated/contracts/contract-methods.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "asm-functions", - "path": "./src/test/e2e-emulated/contracts/asm-functions.tact", - "output": "./src/test/e2e-emulated/contracts/output" - }, - { - "name": "text-message-receivers", - "path": "./src/test/e2e-emulated/contracts/text-message-receivers.tact", - "output": "./src/test/e2e-emulated/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "tact-reserved-contract-errors", - "path": "./src/test/exit-codes/contracts/tact-reserved-contract-errors.tact", - "output": "./src/test/exit-codes/contracts/output", - "options": { - "debug": true - } - }, - { - "name": "compute-phase-errors", - "path": "./src/test/exit-codes/contracts/compute-phase-errors.tact", - "output": "./src/test/exit-codes/contracts/output" - } - ] -} diff --git a/src/benchmarks/benchmarks.spec.ts b/test/benchmarks/benchmarks.spec.ts similarity index 100% rename from src/benchmarks/benchmarks.spec.ts rename to test/benchmarks/benchmarks.spec.ts diff --git a/src/benchmarks/contracts/functions.tact b/test/benchmarks/contracts/functions.tact similarity index 100% rename from src/benchmarks/contracts/functions.tact rename to test/benchmarks/contracts/functions.tact diff --git a/src/test/codegen/all-contracts.tact b/test/codegen/all-contracts.tact similarity index 100% rename from src/test/codegen/all-contracts.tact rename to test/codegen/all-contracts.tact diff --git a/src/test/codegen/empty-message.tact b/test/codegen/empty-message.tact similarity index 100% rename from src/test/codegen/empty-message.tact rename to test/codegen/empty-message.tact diff --git a/src/test/codegen/emptyMap-in-equality.tact b/test/codegen/emptyMap-in-equality.tact similarity index 100% rename from src/test/codegen/emptyMap-in-equality.tact rename to test/codegen/emptyMap-in-equality.tact diff --git a/src/test/codegen/large-contract.tact b/test/codegen/large-contract.tact similarity index 100% rename from src/test/codegen/large-contract.tact rename to test/codegen/large-contract.tact diff --git a/src/test/codegen/map-uint-bool-get.tact b/test/codegen/map-uint-bool-get.tact similarity index 100% rename from src/test/codegen/map-uint-bool-get.tact rename to test/codegen/map-uint-bool-get.tact diff --git a/src/test/codegen/message-opcode-parsing.tact b/test/codegen/message-opcode-parsing.tact similarity index 100% rename from src/test/codegen/message-opcode-parsing.tact rename to test/codegen/message-opcode-parsing.tact diff --git a/src/test/codegen/mutating-method-on-non-lvalues.tact b/test/codegen/mutating-method-on-non-lvalues.tact similarity index 100% rename from src/test/codegen/mutating-method-on-non-lvalues.tact rename to test/codegen/mutating-method-on-non-lvalues.tact diff --git a/src/test/codegen/struct-field-func-keywords-name-clash.tact b/test/codegen/struct-field-func-keywords-name-clash.tact similarity index 100% rename from src/test/codegen/struct-field-func-keywords-name-clash.tact rename to test/codegen/struct-field-func-keywords-name-clash.tact diff --git a/src/test/codegen/struct-field-storage-annotation.tact b/test/codegen/struct-field-storage-annotation.tact similarity index 100% rename from src/test/codegen/struct-field-storage-annotation.tact rename to test/codegen/struct-field-storage-annotation.tact diff --git a/src/test/codegen/struct-with-default-and-optional-fields.tact b/test/codegen/struct-with-default-and-optional-fields.tact similarity index 100% rename from src/test/codegen/struct-with-default-and-optional-fields.tact rename to test/codegen/struct-with-default-and-optional-fields.tact diff --git a/src/test/codegen/var-scope-global-fun-shadowing-allowed.tact b/test/codegen/var-scope-global-fun-shadowing-allowed.tact similarity index 100% rename from src/test/codegen/var-scope-global-fun-shadowing-allowed.tact rename to test/codegen/var-scope-global-fun-shadowing-allowed.tact diff --git a/src/test/compare.spec.ts b/test/compare.spec.ts similarity index 80% rename from src/test/compare.spec.ts rename to test/compare.spec.ts index e397df97b..f0996ff79 100644 --- a/src/test/compare.spec.ts +++ b/test/compare.spec.ts @@ -1,11 +1,11 @@ import fs from "fs"; -import { getParser } from "../050-grammar"; +import { getParser } from "../src/050-grammar"; import { join } from "path"; -import { AstComparator } from "../050-grammar/compare"; +import { AstComparator } from "../src/050-grammar/compare"; import { CONTRACTS_DIR } from "./util"; import * as assert from "assert"; -import { getAstFactory } from "../050-grammar/ast"; -import { defaultParser } from "../050-grammar/grammar"; +import { getAstFactory } from "../src/050-grammar/ast"; +import { defaultParser } from "../src/050-grammar/grammar"; describe("comparator", () => { it.each(fs.readdirSync(CONTRACTS_DIR, { withFileTypes: true }))( diff --git a/src/test/compilation-failed/abi-global-errors.spec.ts b/test/compilation-failed/abi-global-errors.spec.ts similarity index 100% rename from src/test/compilation-failed/abi-global-errors.spec.ts rename to test/compilation-failed/abi-global-errors.spec.ts diff --git a/src/test/compilation-failed/const-eval-failed.spec.ts b/test/compilation-failed/const-eval-failed.spec.ts similarity index 100% rename from src/test/compilation-failed/const-eval-failed.spec.ts rename to test/compilation-failed/const-eval-failed.spec.ts diff --git a/src/test/compilation-failed/contract-duplicate-opcodes.spec.ts b/test/compilation-failed/contract-duplicate-opcodes.spec.ts similarity index 100% rename from src/test/compilation-failed/contract-duplicate-opcodes.spec.ts rename to test/compilation-failed/contract-duplicate-opcodes.spec.ts diff --git a/src/test/compilation-failed/contracts/const-eval-ascii-empty.tact b/test/compilation-failed/contracts/const-eval-ascii-empty.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-ascii-empty.tact rename to test/compilation-failed/contracts/const-eval-ascii-empty.tact diff --git a/src/test/compilation-failed/contracts/const-eval-ascii-overflow-2.tact b/test/compilation-failed/contracts/const-eval-ascii-overflow-2.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-ascii-overflow-2.tact rename to test/compilation-failed/contracts/const-eval-ascii-overflow-2.tact diff --git a/src/test/compilation-failed/contracts/const-eval-ascii-overflow.tact b/test/compilation-failed/contracts/const-eval-ascii-overflow.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-ascii-overflow.tact rename to test/compilation-failed/contracts/const-eval-ascii-overflow.tact diff --git a/src/test/compilation-failed/contracts/const-eval-div-by-zero-in-fun.tact b/test/compilation-failed/contracts/const-eval-div-by-zero-in-fun.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-div-by-zero-in-fun.tact rename to test/compilation-failed/contracts/const-eval-div-by-zero-in-fun.tact diff --git a/src/test/compilation-failed/contracts/const-eval-div-by-zero.tact b/test/compilation-failed/contracts/const-eval-div-by-zero.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-div-by-zero.tact rename to test/compilation-failed/contracts/const-eval-div-by-zero.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-add-in-fun.tact b/test/compilation-failed/contracts/const-eval-int-overflow-add-in-fun.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-add-in-fun.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-add-in-fun.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-add.tact b/test/compilation-failed/contracts/const-eval-int-overflow-add.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-add.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-add.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-div-in-fun.tact b/test/compilation-failed/contracts/const-eval-int-overflow-div-in-fun.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-div-in-fun.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-div-in-fun.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-div.tact b/test/compilation-failed/contracts/const-eval-int-overflow-div.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-div.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-div.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-mul1-in-fun.tact b/test/compilation-failed/contracts/const-eval-int-overflow-mul1-in-fun.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-mul1-in-fun.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-mul1-in-fun.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-mul1.tact b/test/compilation-failed/contracts/const-eval-int-overflow-mul1.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-mul1.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-mul1.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-mul2-in-fun.tact b/test/compilation-failed/contracts/const-eval-int-overflow-mul2-in-fun.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-mul2-in-fun.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-mul2-in-fun.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-mul2.tact b/test/compilation-failed/contracts/const-eval-int-overflow-mul2.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-mul2.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-mul2.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-negative-literal-in-fun.tact b/test/compilation-failed/contracts/const-eval-int-overflow-negative-literal-in-fun.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-negative-literal-in-fun.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-negative-literal-in-fun.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-negative-literal.tact b/test/compilation-failed/contracts/const-eval-int-overflow-negative-literal.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-negative-literal.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-negative-literal.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-positive-literal-in-fun.tact b/test/compilation-failed/contracts/const-eval-int-overflow-positive-literal-in-fun.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-positive-literal-in-fun.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-positive-literal-in-fun.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-positive-literal.tact b/test/compilation-failed/contracts/const-eval-int-overflow-positive-literal.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-positive-literal.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-positive-literal.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-pow-1.tact b/test/compilation-failed/contracts/const-eval-int-overflow-pow-1.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-pow-1.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-pow-1.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-pow-2.tact b/test/compilation-failed/contracts/const-eval-int-overflow-pow-2.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-pow-2.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-pow-2.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-pow2-1.tact b/test/compilation-failed/contracts/const-eval-int-overflow-pow2-1.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-pow2-1.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-pow2-1.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-pow2-2.tact b/test/compilation-failed/contracts/const-eval-int-overflow-pow2-2.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-pow2-2.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-pow2-2.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-shl1.tact b/test/compilation-failed/contracts/const-eval-int-overflow-shl1.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-shl1.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-shl1.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-shl2.tact b/test/compilation-failed/contracts/const-eval-int-overflow-shl2.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-shl2.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-shl2.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-struct-instance-in-fun.tact b/test/compilation-failed/contracts/const-eval-int-overflow-struct-instance-in-fun.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-struct-instance-in-fun.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-struct-instance-in-fun.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-struct-instance.tact b/test/compilation-failed/contracts/const-eval-int-overflow-struct-instance.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-struct-instance.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-struct-instance.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-sub.tact b/test/compilation-failed/contracts/const-eval-int-overflow-sub.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-sub.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-sub.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-ton1.tact b/test/compilation-failed/contracts/const-eval-int-overflow-ton1.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-ton1.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-ton1.tact diff --git a/src/test/compilation-failed/contracts/const-eval-int-overflow-ton2.tact b/test/compilation-failed/contracts/const-eval-int-overflow-ton2.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-int-overflow-ton2.tact rename to test/compilation-failed/contracts/const-eval-int-overflow-ton2.tact diff --git a/src/test/compilation-failed/contracts/const-eval-invalid-address.tact b/test/compilation-failed/contracts/const-eval-invalid-address.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-invalid-address.tact rename to test/compilation-failed/contracts/const-eval-invalid-address.tact diff --git a/src/test/compilation-failed/contracts/const-eval-mod-by-zero.tact b/test/compilation-failed/contracts/const-eval-mod-by-zero.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-mod-by-zero.tact rename to test/compilation-failed/contracts/const-eval-mod-by-zero.tact diff --git a/src/test/compilation-failed/contracts/const-eval-rawslice-invalid.tact b/test/compilation-failed/contracts/const-eval-rawslice-invalid.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-rawslice-invalid.tact rename to test/compilation-failed/contracts/const-eval-rawslice-invalid.tact diff --git a/src/test/compilation-failed/contracts/const-eval-rawslice-not-hex.tact b/test/compilation-failed/contracts/const-eval-rawslice-not-hex.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-rawslice-not-hex.tact rename to test/compilation-failed/contracts/const-eval-rawslice-not-hex.tact diff --git a/src/test/compilation-failed/contracts/const-eval-rawslice-overflow-padded.tact b/test/compilation-failed/contracts/const-eval-rawslice-overflow-padded.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-rawslice-overflow-padded.tact rename to test/compilation-failed/contracts/const-eval-rawslice-overflow-padded.tact diff --git a/src/test/compilation-failed/contracts/const-eval-rawslice-overflow.tact b/test/compilation-failed/contracts/const-eval-rawslice-overflow.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-rawslice-overflow.tact rename to test/compilation-failed/contracts/const-eval-rawslice-overflow.tact diff --git a/src/test/compilation-failed/contracts/const-eval-repeat-lower-bound.tact b/test/compilation-failed/contracts/const-eval-repeat-lower-bound.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-repeat-lower-bound.tact rename to test/compilation-failed/contracts/const-eval-repeat-lower-bound.tact diff --git a/src/test/compilation-failed/contracts/const-eval-repeat-upper-bound.tact b/test/compilation-failed/contracts/const-eval-repeat-upper-bound.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-repeat-upper-bound.tact rename to test/compilation-failed/contracts/const-eval-repeat-upper-bound.tact diff --git a/src/test/compilation-failed/contracts/const-eval-shl-invalid-bits1.tact b/test/compilation-failed/contracts/const-eval-shl-invalid-bits1.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-shl-invalid-bits1.tact rename to test/compilation-failed/contracts/const-eval-shl-invalid-bits1.tact diff --git a/src/test/compilation-failed/contracts/const-eval-shl-invalid-bits2.tact b/test/compilation-failed/contracts/const-eval-shl-invalid-bits2.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-shl-invalid-bits2.tact rename to test/compilation-failed/contracts/const-eval-shl-invalid-bits2.tact diff --git a/src/test/compilation-failed/contracts/const-eval-unboxing-null.tact b/test/compilation-failed/contracts/const-eval-unboxing-null.tact similarity index 100% rename from src/test/compilation-failed/contracts/const-eval-unboxing-null.tact rename to test/compilation-failed/contracts/const-eval-unboxing-null.tact diff --git a/src/test/compilation-failed/contracts/contract-duplicate-bounced-opcode.tact b/test/compilation-failed/contracts/contract-duplicate-bounced-opcode.tact similarity index 100% rename from src/test/compilation-failed/contracts/contract-duplicate-bounced-opcode.tact rename to test/compilation-failed/contracts/contract-duplicate-bounced-opcode.tact diff --git a/src/test/compilation-failed/contracts/contract-duplicate-external-opcode.tact b/test/compilation-failed/contracts/contract-duplicate-external-opcode.tact similarity index 100% rename from src/test/compilation-failed/contracts/contract-duplicate-external-opcode.tact rename to test/compilation-failed/contracts/contract-duplicate-external-opcode.tact diff --git a/src/test/compilation-failed/contracts/contract-duplicate-receiver-opcode.tact b/test/compilation-failed/contracts/contract-duplicate-receiver-opcode.tact similarity index 100% rename from src/test/compilation-failed/contracts/contract-duplicate-receiver-opcode.tact rename to test/compilation-failed/contracts/contract-duplicate-receiver-opcode.tact diff --git a/src/test/compilation-failed/contracts/func-function-does-not-exist.tact b/test/compilation-failed/contracts/func-function-does-not-exist.tact similarity index 100% rename from src/test/compilation-failed/contracts/func-function-does-not-exist.tact rename to test/compilation-failed/contracts/func-function-does-not-exist.tact diff --git a/src/test/compilation-failed/contracts/scope-const-shadows-stdlib-ident.tact b/test/compilation-failed/contracts/scope-const-shadows-stdlib-ident.tact similarity index 100% rename from src/test/compilation-failed/contracts/scope-const-shadows-stdlib-ident.tact rename to test/compilation-failed/contracts/scope-const-shadows-stdlib-ident.tact diff --git a/src/test/compilation-failed/contracts/sha256-expects-string-or-slice.tact b/test/compilation-failed/contracts/sha256-expects-string-or-slice.tact similarity index 100% rename from src/test/compilation-failed/contracts/sha256-expects-string-or-slice.tact rename to test/compilation-failed/contracts/sha256-expects-string-or-slice.tact diff --git a/src/test/compilation-failed/contracts/stdlib-skipBits.tact b/test/compilation-failed/contracts/stdlib-skipBits.tact similarity index 100% rename from src/test/compilation-failed/contracts/stdlib-skipBits.tact rename to test/compilation-failed/contracts/stdlib-skipBits.tact diff --git a/src/test/compilation-failed/func-errors.spec.ts b/test/compilation-failed/func-errors.spec.ts similarity index 100% rename from src/test/compilation-failed/func-errors.spec.ts rename to test/compilation-failed/func-errors.spec.ts diff --git a/src/test/compilation-failed/scope-errors.spec.ts b/test/compilation-failed/scope-errors.spec.ts similarity index 100% rename from src/test/compilation-failed/scope-errors.spec.ts rename to test/compilation-failed/scope-errors.spec.ts diff --git a/src/test/compilation-failed/stdlib-bugs.spec.ts b/test/compilation-failed/stdlib-bugs.spec.ts similarity index 100% rename from src/test/compilation-failed/stdlib-bugs.spec.ts rename to test/compilation-failed/stdlib-bugs.spec.ts diff --git a/src/test/compilation-failed/tact.config.json b/test/compilation-failed/tact.config.json similarity index 100% rename from src/test/compilation-failed/tact.config.json rename to test/compilation-failed/tact.config.json diff --git a/src/test/compilation-failed/util.ts b/test/compilation-failed/util.ts similarity index 93% rename from src/test/compilation-failed/util.ts rename to test/compilation-failed/util.ts index 2d893de24..d37e77278 100644 --- a/src/test/compilation-failed/util.ts +++ b/test/compilation-failed/util.ts @@ -1,4 +1,4 @@ -import { run } from "../../node"; +import { run } from "../../src/node"; // helper to reduce boilerplate export function itShouldNotCompile(params: { diff --git a/test/contracts.build.ts b/test/contracts.build.ts new file mode 100644 index 000000000..2c9be778c --- /dev/null +++ b/test/contracts.build.ts @@ -0,0 +1,25 @@ +import { run } from "../src/node"; +import path from "path"; +import { Logger } from "../src/010-pipeline/logger"; +import { __DANGER__disableVersionNumber } from "../src/010-pipeline/version"; + +// Read cases +void (async () => { + // Disable version number in packages + __DANGER__disableVersionNumber(); + + const logger = new Logger(); + + try { + // Compile projects + const compileResult = await run({ + configPath: path.join(__dirname, "tact.config.json"), + }); + if (!compileResult.ok) { + throw new Error("Tact projects compilation failed"); + } + } catch (error) { + logger.error(error as Error); + process.exit(1); + } +})(); diff --git a/src/test/contracts/attributes.tact b/test/contracts/attributes.tact similarity index 100% rename from src/test/contracts/attributes.tact rename to test/contracts/attributes.tact diff --git a/src/test/contracts/case-1.tact b/test/contracts/case-1.tact similarity index 100% rename from src/test/contracts/case-1.tact rename to test/contracts/case-1.tact diff --git a/src/test/contracts/case-2.tact b/test/contracts/case-2.tact similarity index 100% rename from src/test/contracts/case-2.tact rename to test/contracts/case-2.tact diff --git a/src/test/contracts/case-3.tact b/test/contracts/case-3.tact similarity index 100% rename from src/test/contracts/case-3.tact rename to test/contracts/case-3.tact diff --git a/src/test/contracts/case-4.tact b/test/contracts/case-4.tact similarity index 100% rename from src/test/contracts/case-4.tact rename to test/contracts/case-4.tact diff --git a/src/test/contracts/case-asm-fun.tact b/test/contracts/case-asm-fun.tact similarity index 100% rename from src/test/contracts/case-asm-fun.tact rename to test/contracts/case-asm-fun.tact diff --git a/src/test/contracts/case-augmented-assign.tact b/test/contracts/case-augmented-assign.tact similarity index 100% rename from src/test/contracts/case-augmented-assign.tact rename to test/contracts/case-augmented-assign.tact diff --git a/src/test/contracts/case-bin-ops.tact b/test/contracts/case-bin-ops.tact similarity index 100% rename from src/test/contracts/case-bin-ops.tact rename to test/contracts/case-bin-ops.tact diff --git a/src/test/contracts/case-destructuring.tact b/test/contracts/case-destructuring.tact similarity index 100% rename from src/test/contracts/case-destructuring.tact rename to test/contracts/case-destructuring.tact diff --git a/src/test/contracts/case-if.tact b/test/contracts/case-if.tact similarity index 100% rename from src/test/contracts/case-if.tact rename to test/contracts/case-if.tact diff --git a/src/test/contracts/case-initOf.tact b/test/contracts/case-initOf.tact similarity index 100% rename from src/test/contracts/case-initOf.tact rename to test/contracts/case-initOf.tact diff --git a/src/test/contracts/case-loops.tact b/test/contracts/case-loops.tact similarity index 100% rename from src/test/contracts/case-loops.tact rename to test/contracts/case-loops.tact diff --git a/src/test/contracts/case-message-opcode.tact b/test/contracts/case-message-opcode.tact similarity index 100% rename from src/test/contracts/case-message-opcode.tact rename to test/contracts/case-message-opcode.tact diff --git a/src/test/contracts/case-priority.tact b/test/contracts/case-priority.tact similarity index 100% rename from src/test/contracts/case-priority.tact rename to test/contracts/case-priority.tact diff --git a/src/test/contracts/case-receive.tact b/test/contracts/case-receive.tact similarity index 100% rename from src/test/contracts/case-receive.tact rename to test/contracts/case-receive.tact diff --git a/src/test/contracts/case-traits.tact b/test/contracts/case-traits.tact similarity index 100% rename from src/test/contracts/case-traits.tact rename to test/contracts/case-traits.tact diff --git a/src/test/contracts/case-trycatch.tact b/test/contracts/case-trycatch.tact similarity index 100% rename from src/test/contracts/case-trycatch.tact rename to test/contracts/case-trycatch.tact diff --git a/src/test/contracts/getter-with-method-id-const.tact b/test/contracts/getter-with-method-id-const.tact similarity index 100% rename from src/test/contracts/getter-with-method-id-const.tact rename to test/contracts/getter-with-method-id-const.tact diff --git a/src/test/contracts/getter-with-method-id.tact b/test/contracts/getter-with-method-id.tact similarity index 100% rename from src/test/contracts/getter-with-method-id.tact rename to test/contracts/getter-with-method-id.tact diff --git a/src/test/contracts/native-functions.tact b/test/contracts/native-functions.tact similarity index 100% rename from src/test/contracts/native-functions.tact rename to test/contracts/native-functions.tact diff --git a/src/test/contracts/renamer-expected/attributes.tact b/test/contracts/renamer-expected/attributes.tact similarity index 100% rename from src/test/contracts/renamer-expected/attributes.tact rename to test/contracts/renamer-expected/attributes.tact diff --git a/src/test/contracts/renamer-expected/case-1.tact b/test/contracts/renamer-expected/case-1.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-1.tact rename to test/contracts/renamer-expected/case-1.tact diff --git a/src/test/contracts/renamer-expected/case-2.tact b/test/contracts/renamer-expected/case-2.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-2.tact rename to test/contracts/renamer-expected/case-2.tact diff --git a/src/test/contracts/renamer-expected/case-3.tact b/test/contracts/renamer-expected/case-3.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-3.tact rename to test/contracts/renamer-expected/case-3.tact diff --git a/src/test/contracts/renamer-expected/case-4.tact b/test/contracts/renamer-expected/case-4.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-4.tact rename to test/contracts/renamer-expected/case-4.tact diff --git a/src/test/contracts/renamer-expected/case-asm-fun.tact b/test/contracts/renamer-expected/case-asm-fun.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-asm-fun.tact rename to test/contracts/renamer-expected/case-asm-fun.tact diff --git a/src/test/contracts/renamer-expected/case-augmented-assign.tact b/test/contracts/renamer-expected/case-augmented-assign.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-augmented-assign.tact rename to test/contracts/renamer-expected/case-augmented-assign.tact diff --git a/src/test/contracts/renamer-expected/case-bin-ops.tact b/test/contracts/renamer-expected/case-bin-ops.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-bin-ops.tact rename to test/contracts/renamer-expected/case-bin-ops.tact diff --git a/src/test/contracts/renamer-expected/case-destructuring.tact b/test/contracts/renamer-expected/case-destructuring.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-destructuring.tact rename to test/contracts/renamer-expected/case-destructuring.tact diff --git a/src/test/contracts/renamer-expected/case-if.tact b/test/contracts/renamer-expected/case-if.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-if.tact rename to test/contracts/renamer-expected/case-if.tact diff --git a/src/test/contracts/renamer-expected/case-initOf.tact b/test/contracts/renamer-expected/case-initOf.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-initOf.tact rename to test/contracts/renamer-expected/case-initOf.tact diff --git a/src/test/contracts/renamer-expected/case-loops.tact b/test/contracts/renamer-expected/case-loops.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-loops.tact rename to test/contracts/renamer-expected/case-loops.tact diff --git a/src/test/contracts/renamer-expected/case-message-opcode.tact b/test/contracts/renamer-expected/case-message-opcode.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-message-opcode.tact rename to test/contracts/renamer-expected/case-message-opcode.tact diff --git a/src/test/contracts/renamer-expected/case-priority.tact b/test/contracts/renamer-expected/case-priority.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-priority.tact rename to test/contracts/renamer-expected/case-priority.tact diff --git a/src/test/contracts/renamer-expected/case-receive.tact b/test/contracts/renamer-expected/case-receive.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-receive.tact rename to test/contracts/renamer-expected/case-receive.tact diff --git a/src/test/contracts/renamer-expected/case-traits.tact b/test/contracts/renamer-expected/case-traits.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-traits.tact rename to test/contracts/renamer-expected/case-traits.tact diff --git a/src/test/contracts/renamer-expected/case-trycatch.tact b/test/contracts/renamer-expected/case-trycatch.tact similarity index 100% rename from src/test/contracts/renamer-expected/case-trycatch.tact rename to test/contracts/renamer-expected/case-trycatch.tact diff --git a/src/test/contracts/renamer-expected/getter-with-method-id-const.tact b/test/contracts/renamer-expected/getter-with-method-id-const.tact similarity index 100% rename from src/test/contracts/renamer-expected/getter-with-method-id-const.tact rename to test/contracts/renamer-expected/getter-with-method-id-const.tact diff --git a/src/test/contracts/renamer-expected/getter-with-method-id.tact b/test/contracts/renamer-expected/getter-with-method-id.tact similarity index 100% rename from src/test/contracts/renamer-expected/getter-with-method-id.tact rename to test/contracts/renamer-expected/getter-with-method-id.tact diff --git a/src/test/contracts/renamer-expected/native-functions.tact b/test/contracts/renamer-expected/native-functions.tact similarity index 100% rename from src/test/contracts/renamer-expected/native-functions.tact rename to test/contracts/renamer-expected/native-functions.tact diff --git a/src/test/e2e-emulated/__snapshots__/getters.spec.ts.snap b/test/e2e-emulated/__snapshots__/getters.spec.ts.snap similarity index 100% rename from src/test/e2e-emulated/__snapshots__/getters.spec.ts.snap rename to test/e2e-emulated/__snapshots__/getters.spec.ts.snap diff --git a/src/test/e2e-emulated/__snapshots__/local-type-inference.spec.ts.snap b/test/e2e-emulated/__snapshots__/local-type-inference.spec.ts.snap similarity index 100% rename from src/test/e2e-emulated/__snapshots__/local-type-inference.spec.ts.snap rename to test/e2e-emulated/__snapshots__/local-type-inference.spec.ts.snap diff --git a/src/test/e2e-emulated/__snapshots__/structs.spec.ts.snap b/test/e2e-emulated/__snapshots__/structs.spec.ts.snap similarity index 100% rename from src/test/e2e-emulated/__snapshots__/structs.spec.ts.snap rename to test/e2e-emulated/__snapshots__/structs.spec.ts.snap diff --git a/src/test/e2e-emulated/address.spec.ts b/test/e2e-emulated/address.spec.ts similarity index 100% rename from src/test/e2e-emulated/address.spec.ts rename to test/e2e-emulated/address.spec.ts diff --git a/src/test/e2e-emulated/allocation.spec.ts b/test/e2e-emulated/allocation.spec.ts similarity index 100% rename from src/test/e2e-emulated/allocation.spec.ts rename to test/e2e-emulated/allocation.spec.ts diff --git a/src/test/e2e-emulated/asm-functions.spec.ts b/test/e2e-emulated/asm-functions.spec.ts similarity index 100% rename from src/test/e2e-emulated/asm-functions.spec.ts rename to test/e2e-emulated/asm-functions.spec.ts diff --git a/src/test/e2e-emulated/bounced-routing.spec.ts b/test/e2e-emulated/bounced-routing.spec.ts similarity index 100% rename from src/test/e2e-emulated/bounced-routing.spec.ts rename to test/e2e-emulated/bounced-routing.spec.ts diff --git a/src/test/e2e-emulated/constants.spec.ts b/test/e2e-emulated/constants.spec.ts similarity index 100% rename from src/test/e2e-emulated/constants.spec.ts rename to test/e2e-emulated/constants.spec.ts diff --git a/src/test/e2e-emulated/contract-methods.spec.ts b/test/e2e-emulated/contract-methods.spec.ts similarity index 100% rename from src/test/e2e-emulated/contract-methods.spec.ts rename to test/e2e-emulated/contract-methods.spec.ts diff --git a/src/test/e2e-emulated/contracts/address.tact b/test/e2e-emulated/contracts/address.tact similarity index 100% rename from src/test/e2e-emulated/contracts/address.tact rename to test/e2e-emulated/contracts/address.tact diff --git a/src/test/e2e-emulated/contracts/allocation.tact b/test/e2e-emulated/contracts/allocation.tact similarity index 100% rename from src/test/e2e-emulated/contracts/allocation.tact rename to test/e2e-emulated/contracts/allocation.tact diff --git a/src/test/e2e-emulated/contracts/asm-functions.tact b/test/e2e-emulated/contracts/asm-functions.tact similarity index 100% rename from src/test/e2e-emulated/contracts/asm-functions.tact rename to test/e2e-emulated/contracts/asm-functions.tact diff --git a/src/test/e2e-emulated/contracts/bounced-routing.tact b/test/e2e-emulated/contracts/bounced-routing.tact similarity index 100% rename from src/test/e2e-emulated/contracts/bounced-routing.tact rename to test/e2e-emulated/contracts/bounced-routing.tact diff --git a/src/test/e2e-emulated/contracts/constants.tact b/test/e2e-emulated/contracts/constants.tact similarity index 100% rename from src/test/e2e-emulated/contracts/constants.tact rename to test/e2e-emulated/contracts/constants.tact diff --git a/src/test/e2e-emulated/contracts/contract-methods.tact b/test/e2e-emulated/contracts/contract-methods.tact similarity index 100% rename from src/test/e2e-emulated/contracts/contract-methods.tact rename to test/e2e-emulated/contracts/contract-methods.tact diff --git a/src/test/e2e-emulated/contracts/debug.tact b/test/e2e-emulated/contracts/debug.tact similarity index 100% rename from src/test/e2e-emulated/contracts/debug.tact rename to test/e2e-emulated/contracts/debug.tact diff --git a/src/test/e2e-emulated/contracts/deep-sequence.tact b/test/e2e-emulated/contracts/deep-sequence.tact similarity index 100% rename from src/test/e2e-emulated/contracts/deep-sequence.tact rename to test/e2e-emulated/contracts/deep-sequence.tact diff --git a/src/test/e2e-emulated/contracts/dns.tact b/test/e2e-emulated/contracts/dns.tact similarity index 100% rename from src/test/e2e-emulated/contracts/dns.tact rename to test/e2e-emulated/contracts/dns.tact diff --git a/src/test/e2e-emulated/contracts/external-fallbacks.tact b/test/e2e-emulated/contracts/external-fallbacks.tact similarity index 100% rename from src/test/e2e-emulated/contracts/external-fallbacks.tact rename to test/e2e-emulated/contracts/external-fallbacks.tact diff --git a/src/test/e2e-emulated/contracts/getters.tact b/test/e2e-emulated/contracts/getters.tact similarity index 100% rename from src/test/e2e-emulated/contracts/getters.tact rename to test/e2e-emulated/contracts/getters.tact diff --git a/src/test/e2e-emulated/contracts/implicit-init.tact b/test/e2e-emulated/contracts/implicit-init.tact similarity index 100% rename from src/test/e2e-emulated/contracts/implicit-init.tact rename to test/e2e-emulated/contracts/implicit-init.tact diff --git a/src/test/e2e-emulated/contracts/init-of-message.tact b/test/e2e-emulated/contracts/init-of-message.tact similarity index 100% rename from src/test/e2e-emulated/contracts/init-of-message.tact rename to test/e2e-emulated/contracts/init-of-message.tact diff --git a/src/test/e2e-emulated/contracts/init-return.tact b/test/e2e-emulated/contracts/init-return.tact similarity index 100% rename from src/test/e2e-emulated/contracts/init-return.tact rename to test/e2e-emulated/contracts/init-return.tact diff --git a/src/test/e2e-emulated/contracts/initof-2.tact b/test/e2e-emulated/contracts/initof-2.tact similarity index 100% rename from src/test/e2e-emulated/contracts/initof-2.tact rename to test/e2e-emulated/contracts/initof-2.tact diff --git a/src/test/e2e-emulated/contracts/initof-3.tact b/test/e2e-emulated/contracts/initof-3.tact similarity index 100% rename from src/test/e2e-emulated/contracts/initof-3.tact rename to test/e2e-emulated/contracts/initof-3.tact diff --git a/src/test/e2e-emulated/contracts/initof.tact b/test/e2e-emulated/contracts/initof.tact similarity index 100% rename from src/test/e2e-emulated/contracts/initof.tact rename to test/e2e-emulated/contracts/initof.tact diff --git a/src/test/e2e-emulated/contracts/integer-literals.tact b/test/e2e-emulated/contracts/integer-literals.tact similarity index 100% rename from src/test/e2e-emulated/contracts/integer-literals.tact rename to test/e2e-emulated/contracts/integer-literals.tact diff --git a/src/test/e2e-emulated/contracts/intrinsics.tact b/test/e2e-emulated/contracts/intrinsics.tact similarity index 100% rename from src/test/e2e-emulated/contracts/intrinsics.tact rename to test/e2e-emulated/contracts/intrinsics.tact diff --git a/src/test/e2e-emulated/contracts/local-type-inference.tact b/test/e2e-emulated/contracts/local-type-inference.tact similarity index 100% rename from src/test/e2e-emulated/contracts/local-type-inference.tact rename to test/e2e-emulated/contracts/local-type-inference.tact diff --git a/src/test/e2e-emulated/contracts/map-comparison.tact b/test/e2e-emulated/contracts/map-comparison.tact similarity index 100% rename from src/test/e2e-emulated/contracts/map-comparison.tact rename to test/e2e-emulated/contracts/map-comparison.tact diff --git a/src/test/e2e-emulated/contracts/map-traverse.tact b/test/e2e-emulated/contracts/map-traverse.tact similarity index 100% rename from src/test/e2e-emulated/contracts/map-traverse.tact rename to test/e2e-emulated/contracts/map-traverse.tact diff --git a/src/test/e2e-emulated/contracts/maps1.tact b/test/e2e-emulated/contracts/maps1.tact similarity index 100% rename from src/test/e2e-emulated/contracts/maps1.tact rename to test/e2e-emulated/contracts/maps1.tact diff --git a/src/test/e2e-emulated/contracts/maps2.tact b/test/e2e-emulated/contracts/maps2.tact similarity index 100% rename from src/test/e2e-emulated/contracts/maps2.tact rename to test/e2e-emulated/contracts/maps2.tact diff --git a/src/test/e2e-emulated/contracts/masterchain.tact b/test/e2e-emulated/contracts/masterchain.tact similarity index 100% rename from src/test/e2e-emulated/contracts/masterchain.tact rename to test/e2e-emulated/contracts/masterchain.tact diff --git a/src/test/e2e-emulated/contracts/math.tact b/test/e2e-emulated/contracts/math.tact similarity index 100% rename from src/test/e2e-emulated/contracts/math.tact rename to test/e2e-emulated/contracts/math.tact diff --git a/src/test/e2e-emulated/contracts/mutating-methods.tact b/test/e2e-emulated/contracts/mutating-methods.tact similarity index 100% rename from src/test/e2e-emulated/contracts/mutating-methods.tact rename to test/e2e-emulated/contracts/mutating-methods.tact diff --git a/src/test/e2e-emulated/contracts/non-mutating-methods.tact b/test/e2e-emulated/contracts/non-mutating-methods.tact similarity index 100% rename from src/test/e2e-emulated/contracts/non-mutating-methods.tact rename to test/e2e-emulated/contracts/non-mutating-methods.tact diff --git a/src/test/e2e-emulated/contracts/optionals-2.tact b/test/e2e-emulated/contracts/optionals-2.tact similarity index 100% rename from src/test/e2e-emulated/contracts/optionals-2.tact rename to test/e2e-emulated/contracts/optionals-2.tact diff --git a/src/test/e2e-emulated/contracts/optionals.tact b/test/e2e-emulated/contracts/optionals.tact similarity index 100% rename from src/test/e2e-emulated/contracts/optionals.tact rename to test/e2e-emulated/contracts/optionals.tact diff --git a/src/test/e2e-emulated/contracts/ordering.tact b/test/e2e-emulated/contracts/ordering.tact similarity index 100% rename from src/test/e2e-emulated/contracts/ordering.tact rename to test/e2e-emulated/contracts/ordering.tact diff --git a/src/test/e2e-emulated/contracts/random.tact b/test/e2e-emulated/contracts/random.tact similarity index 100% rename from src/test/e2e-emulated/contracts/random.tact rename to test/e2e-emulated/contracts/random.tact diff --git a/src/test/e2e-emulated/contracts/receiver-empty.tact b/test/e2e-emulated/contracts/receiver-empty.tact similarity index 100% rename from src/test/e2e-emulated/contracts/receiver-empty.tact rename to test/e2e-emulated/contracts/receiver-empty.tact diff --git a/src/test/e2e-emulated/contracts/recursion.tact b/test/e2e-emulated/contracts/recursion.tact similarity index 100% rename from src/test/e2e-emulated/contracts/recursion.tact rename to test/e2e-emulated/contracts/recursion.tact diff --git a/src/test/e2e-emulated/contracts/sample-jetton.tact b/test/e2e-emulated/contracts/sample-jetton.tact similarity index 100% rename from src/test/e2e-emulated/contracts/sample-jetton.tact rename to test/e2e-emulated/contracts/sample-jetton.tact diff --git a/src/test/e2e-emulated/contracts/semantics.tact b/test/e2e-emulated/contracts/semantics.tact similarity index 100% rename from src/test/e2e-emulated/contracts/semantics.tact rename to test/e2e-emulated/contracts/semantics.tact diff --git a/src/test/e2e-emulated/contracts/send.tact b/test/e2e-emulated/contracts/send.tact similarity index 100% rename from src/test/e2e-emulated/contracts/send.tact rename to test/e2e-emulated/contracts/send.tact diff --git a/src/test/e2e-emulated/contracts/serialization-2.tact b/test/e2e-emulated/contracts/serialization-2.tact similarity index 100% rename from src/test/e2e-emulated/contracts/serialization-2.tact rename to test/e2e-emulated/contracts/serialization-2.tact diff --git a/src/test/e2e-emulated/contracts/serialization-3.tact b/test/e2e-emulated/contracts/serialization-3.tact similarity index 100% rename from src/test/e2e-emulated/contracts/serialization-3.tact rename to test/e2e-emulated/contracts/serialization-3.tact diff --git a/src/test/e2e-emulated/contracts/serialization.tact b/test/e2e-emulated/contracts/serialization.tact similarity index 100% rename from src/test/e2e-emulated/contracts/serialization.tact rename to test/e2e-emulated/contracts/serialization.tact diff --git a/src/test/e2e-emulated/contracts/stdlib.tact b/test/e2e-emulated/contracts/stdlib.tact similarity index 100% rename from src/test/e2e-emulated/contracts/stdlib.tact rename to test/e2e-emulated/contracts/stdlib.tact diff --git a/src/test/e2e-emulated/contracts/strings.tact b/test/e2e-emulated/contracts/strings.tact similarity index 100% rename from src/test/e2e-emulated/contracts/strings.tact rename to test/e2e-emulated/contracts/strings.tact diff --git a/src/test/e2e-emulated/contracts/structs.tact b/test/e2e-emulated/contracts/structs.tact similarity index 100% rename from src/test/e2e-emulated/contracts/structs.tact rename to test/e2e-emulated/contracts/structs.tact diff --git a/src/test/e2e-emulated/contracts/ternary.tact b/test/e2e-emulated/contracts/ternary.tact similarity index 100% rename from src/test/e2e-emulated/contracts/ternary.tact rename to test/e2e-emulated/contracts/ternary.tact diff --git a/src/test/e2e-emulated/contracts/text-message-receivers.tact b/test/e2e-emulated/contracts/text-message-receivers.tact similarity index 100% rename from src/test/e2e-emulated/contracts/text-message-receivers.tact rename to test/e2e-emulated/contracts/text-message-receivers.tact diff --git a/src/test/e2e-emulated/contracts/traits.tact b/test/e2e-emulated/contracts/traits.tact similarity index 100% rename from src/test/e2e-emulated/contracts/traits.tact rename to test/e2e-emulated/contracts/traits.tact diff --git a/src/test/e2e-emulated/contracts/try-catch.tact b/test/e2e-emulated/contracts/try-catch.tact similarity index 100% rename from src/test/e2e-emulated/contracts/try-catch.tact rename to test/e2e-emulated/contracts/try-catch.tact diff --git a/src/test/e2e-emulated/contracts/underscore-variable.tact b/test/e2e-emulated/contracts/underscore-variable.tact similarity index 100% rename from src/test/e2e-emulated/contracts/underscore-variable.tact rename to test/e2e-emulated/contracts/underscore-variable.tact diff --git a/src/test/e2e-emulated/debug.spec.ts b/test/e2e-emulated/debug.spec.ts similarity index 97% rename from src/test/e2e-emulated/debug.spec.ts rename to test/e2e-emulated/debug.spec.ts index 36a1d85bf..6f020bf32 100644 --- a/src/test/e2e-emulated/debug.spec.ts +++ b/test/e2e-emulated/debug.spec.ts @@ -1,7 +1,7 @@ import { Address, toNano } from "@ton/core"; import { Blockchain, SandboxContract, TreasuryContract } from "@ton/sandbox"; import { Debug } from "./contracts/output/debug_Debug"; -import { posixNormalize } from "../../utils/filePath"; +import { posixNormalize } from "../../src/utils/filePath"; import "@ton/test-utils"; describe("debug", () => { diff --git a/src/test/e2e-emulated/deep.spec.ts b/test/e2e-emulated/deep.spec.ts similarity index 100% rename from src/test/e2e-emulated/deep.spec.ts rename to test/e2e-emulated/deep.spec.ts diff --git a/src/test/e2e-emulated/dns.spec.ts b/test/e2e-emulated/dns.spec.ts similarity index 100% rename from src/test/e2e-emulated/dns.spec.ts rename to test/e2e-emulated/dns.spec.ts diff --git a/src/test/e2e-emulated/external-fallbacks.spec.ts b/test/e2e-emulated/external-fallbacks.spec.ts similarity index 100% rename from src/test/e2e-emulated/external-fallbacks.spec.ts rename to test/e2e-emulated/external-fallbacks.spec.ts diff --git a/src/test/e2e-emulated/getters.spec.ts b/test/e2e-emulated/getters.spec.ts similarity index 100% rename from src/test/e2e-emulated/getters.spec.ts rename to test/e2e-emulated/getters.spec.ts diff --git a/src/test/e2e-emulated/implicit-init.spec.ts b/test/e2e-emulated/implicit-init.spec.ts similarity index 100% rename from src/test/e2e-emulated/implicit-init.spec.ts rename to test/e2e-emulated/implicit-init.spec.ts diff --git a/src/test/e2e-emulated/init-of-message.spec.ts b/test/e2e-emulated/init-of-message.spec.ts similarity index 100% rename from src/test/e2e-emulated/init-of-message.spec.ts rename to test/e2e-emulated/init-of-message.spec.ts diff --git a/src/test/e2e-emulated/init-return.spec.ts b/test/e2e-emulated/init-return.spec.ts similarity index 100% rename from src/test/e2e-emulated/init-return.spec.ts rename to test/e2e-emulated/init-return.spec.ts diff --git a/src/test/e2e-emulated/initof.spec.ts b/test/e2e-emulated/initof.spec.ts similarity index 100% rename from src/test/e2e-emulated/initof.spec.ts rename to test/e2e-emulated/initof.spec.ts diff --git a/src/test/e2e-emulated/integer-literals.spec.ts b/test/e2e-emulated/integer-literals.spec.ts similarity index 100% rename from src/test/e2e-emulated/integer-literals.spec.ts rename to test/e2e-emulated/integer-literals.spec.ts diff --git a/src/test/e2e-emulated/intrinsics.spec.ts b/test/e2e-emulated/intrinsics.spec.ts similarity index 100% rename from src/test/e2e-emulated/intrinsics.spec.ts rename to test/e2e-emulated/intrinsics.spec.ts diff --git a/src/test/e2e-emulated/local-type-inference.spec.ts b/test/e2e-emulated/local-type-inference.spec.ts similarity index 100% rename from src/test/e2e-emulated/local-type-inference.spec.ts rename to test/e2e-emulated/local-type-inference.spec.ts diff --git a/src/test/e2e-emulated/map-comparison.spec.ts b/test/e2e-emulated/map-comparison.spec.ts similarity index 100% rename from src/test/e2e-emulated/map-comparison.spec.ts rename to test/e2e-emulated/map-comparison.spec.ts diff --git a/src/test/e2e-emulated/map-traverse.spec.ts b/test/e2e-emulated/map-traverse.spec.ts similarity index 100% rename from src/test/e2e-emulated/map-traverse.spec.ts rename to test/e2e-emulated/map-traverse.spec.ts diff --git a/src/test/e2e-emulated/map1.spec.ts b/test/e2e-emulated/map1.spec.ts similarity index 100% rename from src/test/e2e-emulated/map1.spec.ts rename to test/e2e-emulated/map1.spec.ts diff --git a/src/test/e2e-emulated/map2.spec.ts b/test/e2e-emulated/map2.spec.ts similarity index 100% rename from src/test/e2e-emulated/map2.spec.ts rename to test/e2e-emulated/map2.spec.ts diff --git a/src/test/e2e-emulated/masterchain.spec.ts b/test/e2e-emulated/masterchain.spec.ts similarity index 100% rename from src/test/e2e-emulated/masterchain.spec.ts rename to test/e2e-emulated/masterchain.spec.ts diff --git a/src/test/e2e-emulated/math.spec.ts b/test/e2e-emulated/math.spec.ts similarity index 100% rename from src/test/e2e-emulated/math.spec.ts rename to test/e2e-emulated/math.spec.ts diff --git a/src/test/e2e-emulated/mutating-methods.spec.ts b/test/e2e-emulated/mutating-methods.spec.ts similarity index 100% rename from src/test/e2e-emulated/mutating-methods.spec.ts rename to test/e2e-emulated/mutating-methods.spec.ts diff --git a/src/test/e2e-emulated/non-mutating-methods.spec.ts b/test/e2e-emulated/non-mutating-methods.spec.ts similarity index 100% rename from src/test/e2e-emulated/non-mutating-methods.spec.ts rename to test/e2e-emulated/non-mutating-methods.spec.ts diff --git a/src/test/e2e-emulated/optionals.spec.ts b/test/e2e-emulated/optionals.spec.ts similarity index 100% rename from src/test/e2e-emulated/optionals.spec.ts rename to test/e2e-emulated/optionals.spec.ts diff --git a/src/test/e2e-emulated/ordering.spec.ts b/test/e2e-emulated/ordering.spec.ts similarity index 100% rename from src/test/e2e-emulated/ordering.spec.ts rename to test/e2e-emulated/ordering.spec.ts diff --git a/src/test/e2e-emulated/random.spec.ts b/test/e2e-emulated/random.spec.ts similarity index 100% rename from src/test/e2e-emulated/random.spec.ts rename to test/e2e-emulated/random.spec.ts diff --git a/src/test/e2e-emulated/receiver-empty.spec.ts b/test/e2e-emulated/receiver-empty.spec.ts similarity index 100% rename from src/test/e2e-emulated/receiver-empty.spec.ts rename to test/e2e-emulated/receiver-empty.spec.ts diff --git a/src/test/e2e-emulated/recursion.spec.ts b/test/e2e-emulated/recursion.spec.ts similarity index 100% rename from src/test/e2e-emulated/recursion.spec.ts rename to test/e2e-emulated/recursion.spec.ts diff --git a/src/test/e2e-emulated/sample-jetton.spec.ts b/test/e2e-emulated/sample-jetton.spec.ts similarity index 100% rename from src/test/e2e-emulated/sample-jetton.spec.ts rename to test/e2e-emulated/sample-jetton.spec.ts diff --git a/src/test/e2e-emulated/semantics.spec.ts b/test/e2e-emulated/semantics.spec.ts similarity index 100% rename from src/test/e2e-emulated/semantics.spec.ts rename to test/e2e-emulated/semantics.spec.ts diff --git a/src/test/e2e-emulated/send.spec.ts b/test/e2e-emulated/send.spec.ts similarity index 100% rename from src/test/e2e-emulated/send.spec.ts rename to test/e2e-emulated/send.spec.ts diff --git a/src/test/e2e-emulated/serialization.spec.ts b/test/e2e-emulated/serialization.spec.ts similarity index 100% rename from src/test/e2e-emulated/serialization.spec.ts rename to test/e2e-emulated/serialization.spec.ts diff --git a/src/test/e2e-emulated/stdlib.spec.ts b/test/e2e-emulated/stdlib.spec.ts similarity index 100% rename from src/test/e2e-emulated/stdlib.spec.ts rename to test/e2e-emulated/stdlib.spec.ts diff --git a/src/test/e2e-emulated/strings.spec.ts b/test/e2e-emulated/strings.spec.ts similarity index 100% rename from src/test/e2e-emulated/strings.spec.ts rename to test/e2e-emulated/strings.spec.ts diff --git a/src/test/e2e-emulated/structs.spec.ts b/test/e2e-emulated/structs.spec.ts similarity index 100% rename from src/test/e2e-emulated/structs.spec.ts rename to test/e2e-emulated/structs.spec.ts diff --git a/src/test/e2e-emulated/ternary.spec.ts b/test/e2e-emulated/ternary.spec.ts similarity index 100% rename from src/test/e2e-emulated/ternary.spec.ts rename to test/e2e-emulated/ternary.spec.ts diff --git a/src/test/e2e-emulated/text-message-receivers.spec.ts b/test/e2e-emulated/text-message-receivers.spec.ts similarity index 100% rename from src/test/e2e-emulated/text-message-receivers.spec.ts rename to test/e2e-emulated/text-message-receivers.spec.ts diff --git a/src/test/e2e-emulated/traits.spec.ts b/test/e2e-emulated/traits.spec.ts similarity index 100% rename from src/test/e2e-emulated/traits.spec.ts rename to test/e2e-emulated/traits.spec.ts diff --git a/src/test/e2e-emulated/try-catch.spec.ts b/test/e2e-emulated/try-catch.spec.ts similarity index 100% rename from src/test/e2e-emulated/try-catch.spec.ts rename to test/e2e-emulated/try-catch.spec.ts diff --git a/src/test/e2e-emulated/underscore-variable.spec.ts b/test/e2e-emulated/underscore-variable.spec.ts similarity index 100% rename from src/test/e2e-emulated/underscore-variable.spec.ts rename to test/e2e-emulated/underscore-variable.spec.ts diff --git a/src/test/exit-codes/compute-phase-errors.spec.ts b/test/exit-codes/compute-phase-errors.spec.ts similarity index 100% rename from src/test/exit-codes/compute-phase-errors.spec.ts rename to test/exit-codes/compute-phase-errors.spec.ts diff --git a/src/test/exit-codes/contracts/compute-phase-errors.fc b/test/exit-codes/contracts/compute-phase-errors.fc similarity index 100% rename from src/test/exit-codes/contracts/compute-phase-errors.fc rename to test/exit-codes/contracts/compute-phase-errors.fc diff --git a/src/test/exit-codes/contracts/compute-phase-errors.tact b/test/exit-codes/contracts/compute-phase-errors.tact similarity index 100% rename from src/test/exit-codes/contracts/compute-phase-errors.tact rename to test/exit-codes/contracts/compute-phase-errors.tact diff --git a/src/test/exit-codes/contracts/repeat-range.tact b/test/exit-codes/contracts/repeat-range.tact similarity index 100% rename from src/test/exit-codes/contracts/repeat-range.tact rename to test/exit-codes/contracts/repeat-range.tact diff --git a/src/test/exit-codes/contracts/tact-reserved-contract-errors.tact b/test/exit-codes/contracts/tact-reserved-contract-errors.tact similarity index 100% rename from src/test/exit-codes/contracts/tact-reserved-contract-errors.tact rename to test/exit-codes/contracts/tact-reserved-contract-errors.tact diff --git a/src/test/exit-codes/repeat-range.spec.ts b/test/exit-codes/repeat-range.spec.ts similarity index 100% rename from src/test/exit-codes/repeat-range.spec.ts rename to test/exit-codes/repeat-range.spec.ts diff --git a/src/test/exit-codes/tact-reserved-contract-errors.spec.ts b/test/exit-codes/tact-reserved-contract-errors.spec.ts similarity index 100% rename from src/test/exit-codes/tact-reserved-contract-errors.spec.ts rename to test/exit-codes/tact-reserved-contract-errors.spec.ts diff --git a/src/test/rename.spec.ts b/test/rename.spec.ts similarity index 81% rename from src/test/rename.spec.ts rename to test/rename.spec.ts index 7d64fcd5f..003523145 100644 --- a/src/test/rename.spec.ts +++ b/test/rename.spec.ts @@ -1,12 +1,12 @@ import fs from "fs"; import { join } from "path"; -import { AstRenamer } from "../050-grammar/rename"; -import { prettyPrint } from "../prettyPrinter"; +import { AstRenamer } from "../src/050-grammar/rename"; +import { prettyPrint } from "../src/prettyPrinter"; import { trimTrailingCR, CONTRACTS_DIR } from "./util"; import * as assert from "assert"; -import { getParser } from "../050-grammar"; -import { getAstFactory } from "../050-grammar/ast"; -import { defaultParser } from "../050-grammar/grammar"; +import { getParser } from "../src/050-grammar"; +import { getAstFactory } from "../src/050-grammar/ast"; +import { defaultParser } from "../src/050-grammar/grammar"; const EXPECTED_DIR = join(CONTRACTS_DIR, "renamer-expected"); diff --git a/test/tact.config.json b/test/tact.config.json new file mode 100644 index 000000000..d1dfa6e2a --- /dev/null +++ b/test/tact.config.json @@ -0,0 +1,372 @@ +{ + "$schema": "http://raw.githubusercontent.com/tact-lang/tact/main/schemas/configSchema.json", + "projects": [ + { + "name": "benchmark_functions", + "path": "./benchmarks/contracts/functions.tact", + "output": "./benchmarks/contracts/output" + }, + { + "name": "benchmark_functions_inline", + "path": "./benchmarks/contracts/functions.tact", + "output": "./benchmarks/contracts/output", + "options": { + "experimental": { + "inline": true + } + } + }, + { + "name": "codegen", + "path": "./codegen/all-contracts.tact", + "output": "./codegen/output", + "options": { + "debug": true + } + }, + { + "name": "repeat-range", + "path": "./exit-codes/contracts/repeat-range.tact", + "output": "./exit-codes/contracts/output" + }, + { + "name": "tact-reserved-contract-errors", + "path": "./exit-codes/contracts/tact-reserved-contract-errors.tact", + "output": "./exit-codes/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "compute-phase-errors", + "path": "./exit-codes/contracts/compute-phase-errors.tact", + "output": "./exit-codes/contracts/output" + }, + + + + + { + "name": "maps1", + "path": "./e2e-emulated/contracts/maps1.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "maps2", + "path": "./e2e-emulated/contracts/maps2.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "map-traverse", + "path": "./e2e-emulated/contracts/map-traverse.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "map-comparison", + "path": "./e2e-emulated/contracts/map-comparison.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "mutating-methods", + "path": "./e2e-emulated/contracts/mutating-methods.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "non-mutating-methods", + "path": "./e2e-emulated/contracts/non-mutating-methods.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "underscore-variable", + "path": "./e2e-emulated/contracts/underscore-variable.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "optionals", + "path": "./e2e-emulated/contracts/optionals.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "sample-jetton", + "path": "./e2e-emulated/contracts/sample-jetton.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "serialization", + "path": "./e2e-emulated/contracts/serialization.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "serialization-2", + "path": "./e2e-emulated/contracts/serialization-2.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "serialization-3", + "path": "./e2e-emulated/contracts/serialization-3.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "strings", + "path": "./e2e-emulated/contracts/strings.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "constants", + "path": "./e2e-emulated/contracts/constants.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "math", + "path": "./e2e-emulated/contracts/math.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "dns", + "path": "./e2e-emulated/contracts/dns.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "integer-literals", + "path": "./e2e-emulated/contracts/integer-literals.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "random", + "path": "./e2e-emulated/contracts/random.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "ordering", + "path": "./e2e-emulated/contracts/ordering.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "deep", + "path": "./e2e-emulated/contracts/deep-sequence.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "bounced-routing", + "path": "./e2e-emulated/contracts/bounced-routing.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "external-fallbacks", + "path": "./e2e-emulated/contracts/external-fallbacks.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "external": true + } + }, + { + "name": "debug", + "path": "./e2e-emulated/contracts/debug.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "send", + "path": "./e2e-emulated/contracts/send.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "intrinsics", + "path": "./e2e-emulated/contracts/intrinsics.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "masterchain", + "path": "./e2e-emulated/contracts/masterchain.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "try-catch", + "path": "./e2e-emulated/contracts/try-catch.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "address", + "path": "./e2e-emulated/contracts/address.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "ternary", + "path": "./e2e-emulated/contracts/ternary.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "implicit-init", + "path": "./e2e-emulated/contracts/implicit-init.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "recursion", + "path": "./e2e-emulated/contracts/recursion.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "local-type-inference", + "path": "./e2e-emulated/contracts/local-type-inference.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "stdlib", + "path": "./e2e-emulated/contracts/stdlib.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "structs", + "path": "./e2e-emulated/contracts/structs.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "initof", + "path": "./e2e-emulated/contracts/initof.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "initof-2", + "path": "./e2e-emulated/contracts/initof-2.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "initof-3", + "path": "./e2e-emulated/contracts/initof-3.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + }, + { + "name": "getters", + "path": "./e2e-emulated/contracts/getters.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "allocation", + "path": "./e2e-emulated/contracts/allocation.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "traits", + "path": "./e2e-emulated/contracts/traits.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "receiver-empty", + "path": "./e2e-emulated/contracts/receiver-empty.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "init-of-message", + "path": "./e2e-emulated/contracts/init-of-message.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "init-return", + "path": "./e2e-emulated/contracts/init-return.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "semantics", + "path": "./e2e-emulated/contracts/semantics.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "contract-methods", + "path": "./e2e-emulated/contracts/contract-methods.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "asm-functions", + "path": "./e2e-emulated/contracts/asm-functions.tact", + "output": "./e2e-emulated/contracts/output" + }, + { + "name": "text-message-receivers", + "path": "./e2e-emulated/contracts/text-message-receivers.tact", + "output": "./e2e-emulated/contracts/output", + "options": { + "debug": true + } + } + ] +} diff --git a/scripts/tsconfig.json b/test/tsconfig.json similarity index 100% rename from scripts/tsconfig.json rename to test/tsconfig.json diff --git a/src/test/util.ts b/test/util.ts similarity index 100% rename from src/test/util.ts rename to test/util.ts diff --git a/src/test/utils/randomAddress.ts b/test/utils/randomAddress.ts similarity index 100% rename from src/test/utils/randomAddress.ts rename to test/utils/randomAddress.ts diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 50fff32bc..24e4cbe17 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -7,7 +7,8 @@ "include": [ "src/", "examples/", - "scripts/", + "func/", + "test/", "./jest.config.js", "bin/tact.js", "bin/unboc.js" diff --git a/tsconfig.json b/tsconfig.json index 12aa2324d..06a1099e4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,5 +4,5 @@ "outDir": "./dist" }, "include": ["src/**/*"], - "exclude": ["**/**.spec.ts", "**/**.bind.ts", "src/test/features/output/**/*"] + "exclude": ["**/**.spec.ts", "**/**.bind.ts", "test/features/output/**/*"] } From 4a73e531b17492e89a82a9b7445a183264a12c3b Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 21:14:47 +0400 Subject: [PATCH 23/26] fix build --- package.json | 10 +++++++--- src/040-imports/copy.build.ts | 28 ++++++++++++++++++++++++++++ src/050-grammar/prev/copy.build.ts | 5 ++++- src/090-func/copy.build.ts | 2 +- src/index.ts | 17 +++++++++++++++++ src/main.ts | 18 ------------------ 6 files changed, 57 insertions(+), 23 deletions(-) create mode 100644 src/040-imports/copy.build.ts delete mode 100644 src/main.ts diff --git a/package.json b/package.json index e0b4aee26..2c73e257b 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,10 @@ "gen": "yarn gen:grammar && yarn gen:stdlib && yarn gen:func-js && yarn gen:examples && yarn gen:func && yarn gen:projects", "clean": "rm -fr dist", "cleanall": "rm -fr dist node_modules", + "build:stdlib": "ts-node ./src/040-imports/copy.build.ts", "build:func": "ts-node ./src/090-func/copy.build.ts", "build:grammar": "ts-node ./src/050-grammar/prev/copy.build.ts", - "build": "tsc && yarn build:func && yarn build:grammar", + "build": "tsc && yarn build:stdlib && yarn build:func && yarn build:grammar", "test": "yarn gen:grammar && jest", "coverage": "cross-env COVERAGE=true jest", "release": "yarn clean && yarn build && yarn coverage && yarn release-it --npm.yarn1", @@ -42,13 +43,16 @@ "postpack": "pinst --enable" }, "files": [ + "!**/*", "dist/**/*", - "src/**/*", + "src/040-imports/stdlib/**/*", "bin/**/*", + "!**/*.build.js*", + "!**/*.build.d.ts*", "!**/test", "!/docs" ], - "main": "./dist/main.js", + "main": "./dist/index.js", "bin": { "tact": "bin/tact.js", "unboc": "bin/unboc.js" diff --git a/src/040-imports/copy.build.ts b/src/040-imports/copy.build.ts new file mode 100644 index 000000000..7434c8249 --- /dev/null +++ b/src/040-imports/copy.build.ts @@ -0,0 +1,28 @@ +import * as fs from "fs/promises"; +import * as path from "path"; +import * as glob from "glob"; + +const cp = async (fromGlob: string, toPath: string) => { + for (const file of glob.sync(path.join(fromGlob, '**/*'))) { + const relPath = path.relative(fromGlob, file); + const pathTo = path.join(toPath, relPath); + const stat = await fs.stat(file); + if (stat.isDirectory()) { + await fs.mkdir(pathTo, { recursive: true }); + } else { + await fs.mkdir(path.dirname(pathTo), { recursive: true }); + await fs.copyFile(file, pathTo); + } + } +}; + +const main = async () => { + try { + await cp("./src/040-imports/stdlib/", "./dist/040-imports/stdlib/"); + } catch (e) { + console.error(e); + process.exit(1); + } +}; + +void main(); diff --git a/src/050-grammar/prev/copy.build.ts b/src/050-grammar/prev/copy.build.ts index d1d55be0d..ef6076509 100644 --- a/src/050-grammar/prev/copy.build.ts +++ b/src/050-grammar/prev/copy.build.ts @@ -9,9 +9,12 @@ const cp = async (fromGlob: string, toPath: string) => { } }; +const fromPath = path.join(__dirname, "/grammar.ohm*"); +const toPath = path.join(__dirname, "../../../dist/050-grammar/prev/"); + const main = async () => { try { - await cp("./src/grammar/prev/grammar.ohm*", "./dist/grammar/prev/"); + await cp(fromPath, toPath); } catch (e) { console.error(e); process.exit(1); diff --git a/src/090-func/copy.build.ts b/src/090-func/copy.build.ts index 51846b91f..0a4b5f7fa 100644 --- a/src/090-func/copy.build.ts +++ b/src/090-func/copy.build.ts @@ -11,7 +11,7 @@ const cp = async (fromGlob: string, toPath: string) => { const main = async () => { try { - await cp("./src/090-func/funcfiftlib.*", "./dist/func/"); + await cp("./src/090-func/funcfiftlib.*", "./dist/090-func/"); } catch (e) { console.error(e); process.exit(1); diff --git a/src/index.ts b/src/index.ts index 78afabaaa..892f35d46 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,3 +16,20 @@ export { AstSorter } from "./050-grammar/sort"; export { AstRenamer } from "./050-grammar/rename"; export { AstHasher } from "./050-grammar/hash"; export { AstComparator } from "./050-grammar/compare"; + +export { + Config, + ConfigProject, + parseConfig, + verifyConfig, +} from "./000-config/parseConfig"; + +export { PackageFileFormat } from "./110-packaging/fileFormat"; + +export { VirtualFileSystem } from "./020-vfs/VirtualFileSystem"; + +export { createVirtualFileSystem } from "./020-vfs/createVirtualFileSystem"; + +export * from "./browser"; +export * from "./010-pipeline/logger"; +export * from "./030-error/errors"; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts deleted file mode 100644 index 570caea93..000000000 --- a/src/main.ts +++ /dev/null @@ -1,18 +0,0 @@ -export { - Config, - ConfigProject, - parseConfig, - verifyConfig, -} from "./000-config/parseConfig"; - -export { PackageFileFormat } from "./110-packaging/fileFormat"; - -export { build } from "./010-pipeline/build"; - -export { VirtualFileSystem } from "./020-vfs/VirtualFileSystem"; - -export { createVirtualFileSystem } from "./020-vfs/createVirtualFileSystem"; - -export * from "./browser"; -export * from "./010-pipeline/logger"; -export * from "./030-error/errors"; From 18121c73a61d931dbbb1b0eeca38515f6aad9d16 Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 21:17:54 +0400 Subject: [PATCH 24/26] prepush --- knip.json | 1 + src/040-imports/copy.build.ts | 2 +- src/040-imports/stdlib.ts | 1704 ++++++++++++++++----------------- src/index.ts | 2 +- test/tact.config.json | 3 - 5 files changed, 855 insertions(+), 857 deletions(-) diff --git a/knip.json b/knip.json index bb3dadd49..fc200651e 100644 --- a/knip.json +++ b/knip.json @@ -10,6 +10,7 @@ "project": ["src/**/*.ts", "bin/tact.js", "bin/unboc.js"], "ignore": [ "src/prettyPrinter/index.ts", + "src/000-config/parseConfig.ts", "src/030-error/display-to-json.ts", "src/050-grammar/ast.ts", "src/050-grammar/src-info.ts", diff --git a/src/040-imports/copy.build.ts b/src/040-imports/copy.build.ts index 7434c8249..62d2c1b63 100644 --- a/src/040-imports/copy.build.ts +++ b/src/040-imports/copy.build.ts @@ -3,7 +3,7 @@ import * as path from "path"; import * as glob from "glob"; const cp = async (fromGlob: string, toPath: string) => { - for (const file of glob.sync(path.join(fromGlob, '**/*'))) { + for (const file of glob.sync(path.join(fromGlob, "**/*"))) { const relPath = path.relative(fromGlob, file); const pathTo = path.join(toPath, relPath); const stat = await fs.stat(file); diff --git a/src/040-imports/stdlib.ts b/src/040-imports/stdlib.ts index 27563ec77..fecc9feb3 100644 --- a/src/040-imports/stdlib.ts +++ b/src/040-imports/stdlib.ts @@ -1,853 +1,853 @@ const files: Record = {}; -files['libs/config.tact'] = - 'ZnVuIGdldENvbmZpZ0FkZHJlc3MoKTogQWRkcmVzcyB7CiAgICBsZXQgY2VsbDogQ2VsbCA9IGdldENvbmZpZ1BhcmFtKDApISE7CiAgICBsZXQgc2M6IFNsaWNlID0g' + - 'Y2VsbC5iZWdpblBhcnNlKCk7CiAgICByZXR1cm4gbmV3QWRkcmVzcygtMSwgc2MubG9hZFVpbnQoMjU2KSk7Cn0KCmZ1biBnZXRFbGVjdG9yQWRkcmVzcygpOiBBZGRy' + - 'ZXNzIHsKICAgIGxldCBjZWxsOiBDZWxsID0gZ2V0Q29uZmlnUGFyYW0oMSkhITsKICAgIGxldCBzYzogU2xpY2UgPSBjZWxsLmJlZ2luUGFyc2UoKTsKICAgIHJldHVy' + - 'biBuZXdBZGRyZXNzKC0xLCBzYy5sb2FkVWludCgyNTYpKTsKfQ=='; -files['libs/content.tact'] = - 'ZnVuIGNyZWF0ZU9mZmNoYWluQ29udGVudChsaW5rOiBTdHJpbmcpOiBDZWxsIHsKICAgIGxldCBidWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gYmVnaW5TdHJpbmdGcm9t' + - 'QnVpbGRlcihiZWdpbkNlbGwoKS5zdG9yZVVpbnQoMHgwMSwgOCkpOwogICAgYnVpbGRlci5hcHBlbmQobGluayk7CiAgICByZXR1cm4gYnVpbGRlci50b0NlbGwoKTsK' + - 'fQ=='; -files['libs/deploy.tact'] = - 'Cm1lc3NhZ2UgRGVwbG95IHsKICAgIHF1ZXJ5SWQ6IEludCBhcyB1aW50NjQ7Cn0KCm1lc3NhZ2UgRGVwbG95T2sgewogICAgcXVlcnlJZDogSW50IGFzIHVpbnQ2NDsK' + - 'fQoKdHJhaXQgRGVwbG95YWJsZSB7CiAgICByZWNlaXZlKGRlcGxveTogRGVwbG95KSB7CiAgICAgICAgc2VsZi5ub3RpZnkoRGVwbG95T2t7cXVlcnlJZDogZGVwbG95' + - 'LnF1ZXJ5SWR9LnRvQ2VsbCgpKTsKICAgIH0KfQoKbWVzc2FnZSBGYWN0b3J5RGVwbG95IHsKICAgIHF1ZXJ5SWQ6IEludCBhcyB1aW50NjQ7CiAgICBjYXNoYmFjazog' + - 'QWRkcmVzczsKfQoKdHJhaXQgRmFjdG9yeURlcGxveWFibGUgIHsKICAgIHJlY2VpdmUoZGVwbG95OiBGYWN0b3J5RGVwbG95KSB7CiAgICAgICAgc2VsZi5mb3J3YXJk' + - 'KGRlcGxveS5jYXNoYmFjaywgRGVwbG95T2t7cXVlcnlJZDogZGVwbG95LnF1ZXJ5SWR9LnRvQ2VsbCgpLCBmYWxzZSwgbnVsbCk7CiAgICB9Cn0='; -files['libs/dns.fc'] = - 'c2xpY2UgZG5zX3N0cmluZ190b19pbnRlcm5hbChzbGljZSBkb21haW4pIGlubGluZV9yZWYgewoKICAgIDs7IFNwZWNpYWwgY2FzZSBmb3Igcm9vdCBkb21haW4KICAg' + - 'IGlmICgoZG9tYWluLnNsaWNlX2JpdHMoKSA9PSA4KSAmIChkb21haW4uc2xpY2VfcmVmcygpID09IDApKSB7CiAgICAgICAgaWYgKGRvbWFpbi5wcmVsb2FkX3VpbnQo' + - 'OCkgPT0gNDYpIHsKICAgICAgICAgICAgcmV0dXJuIGJlZ2luX2NlbGwoKS5zdG9yZV91aW50KDAsIDgpLmVuZF9jZWxsKCkuYmVnaW5fcGFyc2UoKTsKICAgICAgICB9' + - 'CiAgICB9CiAgICAKICAgIDs7IFNwbGl0IGRvbWFpbiBpbnRvIHNlZ21lbnRzCiAgICB0dXBsZSBzZWdtZW50cyA9IG51bGwoKTsKICAgIGJ1aWxkZXIgY3VycmVudCA9' + - 'IGJlZ2luX2NlbGwoKTsKICAgIGludCBpc0N1cnJlbnRFbXB0eSA9IHRydWU7CiAgICBpbnQgaXNGaXJzdCA9IHRydWU7CiAgICBpbnQgaXNIeXBoZW4gPSBmYWxzZTsK' + - 'ICAgIHNsaWNlIGNzID0gZG9tYWluOwogICAgaW50IGNvbnRpbnVlID0gdHJ1ZTsKICAgIGRvIHsKCiAgICAgICAgOzsgUHJlcGFyZSBmb3IgbG9hZGluZyBuZXh0IGNo' + - 'YXJhY3RlcgogICAgICAgIGlmIChjcy5zbGljZV9iaXRzKCkgPT0gMCkgewogICAgICAgICAgICBpbnQgcmVmcyA9IGNzLnNsaWNlX3JlZnMoKTsKICAgICAgICAgICAg' + - 'aWYgKHJlZnMgPT0gMSkgewogICAgICAgICAgICAgICAgY3MgPSBjc35sb2FkX3JlZigpLmJlZ2luX3BhcnNlKCk7CiAgICAgICAgICAgIH0gZWxzZWlmIChyZWZzID4g' + - 'MSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGwoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlID0gZmFsc2U7CiAgICAg' + - 'ICAgICAgIH0KICAgICAgICAgICAgY29udGludWUgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIDs7IENvbnRpbnVlIGxvYWRpbmcgbmV4dCBjaGFyYWN0ZXIKICAg' + - 'ICAgICBpZiAoY29udGludWUpIHsKICAgICAgICAgICAgaW50IGNoYXIgPSBjc35sb2FkX3VpbnQoOCk7CiAgICAgICAgICAgIDs7IHdlIGNhbiBkbyBpdCBiZWNhdXNl' + - 'IGFkZGl0aW9uYWwgVVRGLTggY2hhcmFjdGVyJ3Mgb2N0ZXRzID49IDEyOCAtLSBodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzYyOS50eHQKICAgICAgICAgICAg' + - 'aW50IGlzX2h5cGhlbiA9IChjaGFyID09IDQ1KTsKICAgICAgICAgICAgaW50IGlzX2RvdCAgPSAoY2hhciA9PSA0Nik7CiAgICAgICAgICAgIGludCB2YWxpZF9jaGFy' + - 'ID0gaXNfaHlwaGVuIHwgaXNfZG90IHwgKChjaGFyID49IDQ4KSAmIChjaGFyIDw9IDU3KSkgfCAoKGNoYXIgPj0gOTcpICYgKGNoYXIgPD0gMTIyKSk7IDs7ICctJyBv' + - 'ciAwLTkgb3IgYS16CiAgICAgICAgICAgIGlmICh+IHZhbGlkX2NoYXIgfCAoaXNGaXJzdCAmIGlzX2h5cGhlbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxs' + - 'KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaXNIeXBoZW4gPSBpc19oeXBoZW47CiAgICAgICAgICAgIGlmIChpc19kb3QpIHsKICAgICAgICAgICAgICAgIGlm' + - 'IChpc0ZpcnN0IHwgaXNIeXBoZW4pIHsgOzsgRW1wdHkgb3IgZW5kcyB3aXRoIGh5cGhlbgogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsKCk7CiAgICAgICAg' + - 'ICAgICAgICB9CiAgICAgICAgICAgICAgICBzZWdtZW50cyA9IGNvbnMoY3VycmVudCwgc2VnbWVudHMpOwogICAgICAgICAgICAgICAgY3VycmVudCA9IGJlZ2luX2Nl' + - 'bGwoKTsKICAgICAgICAgICAgICAgIGlzSHlwaGVuID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpc0ZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlzQ3VycmVu' + - 'dEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlzQ3VycmVudEVt' + - 'cHR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBjdXJyZW50fnN0b3JlX3VpbnQoY2hhciwgOCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSB1bnRpbCAo' + - 'fiBjb250aW51ZSk7CiAgICBpZiAoaXNIeXBoZW4pIHsgOzsgZW5kcyB3aXRoIGh5cGhlbgogICAgICAgIHJldHVybiBudWxsKCk7CiAgICB9CiAgICBpZiAofiBpc0N1' + - 'cnJlbnRFbXB0eSkgewogICAgICAgIHNlZ21lbnRzID0gY29ucyhjdXJyZW50LCBzZWdtZW50cyk7CiAgICB9CgogICAgOzsgQ29uY2F0ZW5hdGUgc2VnbWVudHMKICAg' + - 'IGJ1aWxkZXIgcmVzID0gYmVnaW5fY2VsbCgpOwogICAgKGJ1aWxkZXIgYiwgdHVwbGUgdGFpbCkgPSB1bmNvbnMoc2VnbWVudHMpOwogICAgcmVzID0gcmVzLnN0b3Jl' + - 'X2J1aWxkZXIoYik7CiAgICB3aGlsZSh+IG51bGw/KHRhaWwpKSB7CiAgICAgICAgKGIsIHRhaWwpID0gdW5jb25zKHRhaWwpOwogICAgICAgIHJlcyA9IHJlcy5zdG9y' + - 'ZV91aW50KDAsIDgpOyA7OyBBZGQgXDAgc2VwYXJhdG9yCiAgICAgICAgcmVzID0gcmVzLnN0b3JlX2J1aWxkZXIoYik7CiAgICB9CiAgICByZXMgPSByZXMuc3RvcmVf' + - 'dWludCgwLCA4KTsgOzsgQWRkIFwwIHNlcGFyYXRvcgogICAgcmV0dXJuIHJlcy5lbmRfY2VsbCgpLmJlZ2luX3BhcnNlKCk7Cn0KCmludCBkbnNfaW50ZXJuYWxfdmVy' + - 'aWZ5KHNsaWNlIHNjKSBpbmxpbmVfcmVmIHsKICAgIGlmIChzYy5zbGljZV9yZWZzKCkgIT0gMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGludCBi' + - 'aXRzID0gc2Muc2xpY2VfYml0cygpOwogICAgaWYgKGJpdHMgJSA4ICE9IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoYml0cyA9PSAwKSB7' + - 'IDs7IENhc2UgZm9yIHJvb3QgZG9tYWluCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpbnQgbGVuID0gYml0cyAvIDg7CiAgICBpbnQgY291bnRlciA9IDA7' + - 'CiAgICBpbnQgaXNGaXJzdCA9IHRydWU7CiAgICBpbnQgaXNIeXBoZW4gPSBmYWxzZTsKICAgIHJlcGVhdChsZW4pIHsKICAgICAgICBpbnQgY2hhciA9IHNjfmxvYWRf' + - 'dWludCg4KTsKICAgICAgICBpZiAoY2hhciA9PSAwKSB7CiAgICAgICAgICAgIGlmIChjb3VudGVyID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK' + - 'ICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNIeXBoZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAg' + - 'ICBjb3VudGVyID0gMDsKICAgICAgICAgICAgaXNIeXBoZW4gPSBmYWxzZTsKICAgICAgICAgICAgaXNGaXJzdCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAg' + - 'ICAgICAgaW50IGNoYXJJc0h5cGhlbiA9IChjaGFyID09IDQ1KTsKICAgICAgICAgICAgaW50IGlzVmFsaWQgPSBjaGFySXNIeXBoZW4gfCAoKGNoYXIgPj0gNDgpICYg' + - 'KGNoYXIgPD0gNTcpKSB8ICgoY2hhciA+PSA5NykgJiAoY2hhciA8PSAxMjIpKTsKICAgICAgICAgICAgaWYgKH4gaXNWYWxpZCkgewogICAgICAgICAgICAgICAgcmV0' + - 'dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGFySXNIeXBoZW4gJiBpc0ZpcnN0KSAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl' + - 'OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlzSHlwaGVuID0gY2hhcklzSHlwaGVuOwogICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIGNv' + - 'dW50ZXIgPSBjb3VudGVyICsgMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY291bnRlciA9PSAwICYgfiBpc0h5cGhlbjsKfQoKc2xpY2UgZG5zX2ludGVybmFs' + - 'X25vcm1hbGl6ZShzbGljZSBzcmMpIGltcHVyZSBpbmxpbmVfcmVmIHsKICAgIHRocm93X3VubGVzcygxMzQsIHNyYy5zbGljZV9yZWZzKCkgPT0gMCk7IDs7IEludmFs' + - 'aWQgYXJndW1lbnQgZXJyb3IKICAgIGJ1aWxkZXIgdGFyZ2V0ID0gYmVnaW5fY2VsbCgpOwogICAgcmVwZWF0KHNyYy5zbGljZV9iaXRzKCkgLyA4KSB7CiAgICAgICAg' + - 'aW50IGNoYXIgPSBzcmN+bG9hZF91aW50KDgpOwoKICAgICAgICA7OyBiID0+IDYKICAgICAgICBpZiAoY2hhciA9PSA5OCkgewogICAgICAgICAgICBjaGFyID0gNTQ7' + - 'CiAgICAgICAgfQoKICAgICAgICA7OyBnLCBxID0+IDkKICAgICAgICBpZiAoKGNoYXIgPT0gMTAzKSB8IChjaGFyID09IDExMykpIHsKICAgICAgICAgICAgY2hhciA9' + - 'IDU3OyAgICAKICAgICAgICB9CgogICAgICAgIDs7IGwgPT4gMQogICAgICAgIGlmIChjaGFyID09IDEwOCkgewogICAgICAgICAgICBjaGFyID0gNDk7CiAgICAgICAg' + - 'fQoKICAgICAgICA7OyBvID0+IDAKICAgICAgICBpZiAoY2hhciA9PSAxMTEpIHsKICAgICAgICAgICAgY2hhciA9IDQ4OwogICAgICAgIH0KCiAgICAgICAgOzsgcyA9' + - 'PiA1CiAgICAgICAgaWYgKGNoYXIgPT0gMTE1KSB7CiAgICAgICAgICAgIGNoYXIgPSA1MzsKICAgICAgICB9CgogICAgICAgIDs7IHUgPT4gdgogICAgICAgIGlmIChj' + - 'aGFyID09IDExNykgewogICAgICAgICAgICBjaGFyID0gMTE4OwogICAgICAgIH0KCiAgICAgICAgOzsgeiA9PiAyCiAgICAgICAgaWYgKGNoYXIgPT0gMTIyKSB7CiAg' + - 'ICAgICAgICAgIGNoYXIgPSA1MDsKICAgICAgICB9CgogICAgICAgIHRhcmdldCA9IHRhcmdldC5zdG9yZV91aW50KGNoYXIsIDgpOwogICAgfQogICAgcmV0dXJuIHRh' + - 'cmdldC5lbmRfY2VsbCgpLmJlZ2luX3BhcnNlKCk7Cn0K'; -files['libs/dns.tact'] = - 'aW1wb3J0ICIuL2Rucy5mYyI7CgpzdHJ1Y3QgRE5TUmVzb2x2ZVJlc3VsdCB7CiAgICBwcmVmaXg6IEludDsgCiAgICByZWNvcmQ6IENlbGw/OyAKfQoKQG5hbWUoZG5z' + - 'X3N0cmluZ190b19pbnRlcm5hbCkKbmF0aXZlIGRuc1N0cmluZ1RvSW50ZXJuYWwoc3RyOiBTdHJpbmcpOiBTbGljZT87CgpAbmFtZShkbnNfaW50ZXJuYWxfbm9ybWFs' + - 'aXplKQpuYXRpdmUgZG5zSW50ZXJuYWxOb3JtYWxpemUoc3JjOiBTbGljZSk6IFNsaWNlOwoKQG5hbWUoZG5zX2ludGVybmFsX3ZlcmlmeSkKbmF0aXZlIGRuc0ludGVy' + - 'bmFsVmVyaWZ5KHN1YmRvbWFpbjogU2xpY2UpOiBCb29sOwoKZnVuIGRuc0V4dHJhY3RUb3BEb21haW5MZW5ndGgoc3ViZG9tYWluOiBTbGljZSk6IEludCB7CiAgICBs' + - 'ZXQgaTogSW50ID0gMDsKICAgIGxldCBuZWVkQnJlYWs6IEJvb2wgPSBmYWxzZTsKICAgIGRvIHsKICAgICAgICBsZXQgY2hhcjogSW50ID0gc3ViZG9tYWluLmxvYWRV' + - 'aW50KDgpOyAvLyB3ZSBkbyBub3QgY2hlY2sgZG9tYWluLmxlbmd0aCBiZWNhdXNlIGl0IE1VU1QgY29udGFpbnMgXDAgY2hhcmFjdGVyCiAgICAgICAgbmVlZEJyZWFr' + - 'ID0gY2hhciA9PSAwOwogICAgICAgIGlmICghbmVlZEJyZWFrKSB7CiAgICAgICAgICAgIGkgPSBpICsgODsKICAgICAgICB9CiAgICB9IHVudGlsIChuZWVkQnJlYWsp' + - 'OwogICAgcmVxdWlyZShpICE9IDAsICJJbnZhbGlkIEROUyBuYW1lIik7CiAgICByZXR1cm4gaTsKfQoKZnVuIGRuc0V4dHJhY3RUb3BEb21haW4oc3ViZG9tYWluOiBT' + - 'bGljZSk6IFNsaWNlIHsKICAgIGxldCBsZW46IEludCA9IGRuc0V4dHJhY3RUb3BEb21haW5MZW5ndGgoc3ViZG9tYWluKTsKICAgIHJldHVybiBzdWJkb21haW4ubG9h' + - 'ZEJpdHMobGVuKTsKfQoKZnVuIGRuc1Jlc29sdmVOZXh0KGFkZHJlc3M6IEFkZHJlc3MpOiBDZWxsIHsKICAgIHJldHVybiBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9y' + - 'ZVVpbnQoMHhiYTkzLCAxNikKICAgICAgICAuc3RvcmVBZGRyZXNzKGFkZHJlc3MpCiAgICAgICAgLmVuZENlbGwoKTsKfQoKZnVuIGRuc1Jlc29sdmVXYWxsZXQoYWRk' + - 'cmVzczogQWRkcmVzcyk6IENlbGwgewogICAgcmV0dXJuIGJlZ2luQ2VsbCgpCiAgICAgICAgLnN0b3JlVWludCgweDlmZDMsIDE2KQogICAgICAgIC5zdG9yZUFkZHJl' + - 'c3MoYWRkcmVzcykKICAgICAgICAuc3RvcmVVaW50KDAsIDgpCiAgICAgICAgLmVuZENlbGwoKTsKfQoKdHJhaXQgRE5TUmVzb2x2ZXIgewoKICAgIGdldCBmdW4gZG5z' + - 'cmVzb2x2ZShzdWJkb21haW46IFNsaWNlLCBjYXRlZ29yeTogSW50KTogRE5TUmVzb2x2ZVJlc3VsdCB7CgogICAgICAgIC8vIE5vcm1hbGl6ZQogICAgICAgIGxldCBk' + - 'ZWx0YTogSW50ID0gMDsKICAgICAgICBpZiAoc3ViZG9tYWluLnByZWxvYWRVaW50KDgpID09IDApIHsKICAgICAgICAgICAgc3ViZG9tYWluLmxvYWRVaW50KDgpOyAv' + - 'LyBTa2lwIGZpcnN0IGJ5dGUKICAgICAgICAgICAgZGVsdGEgPSBkZWx0YSArIDg7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVja3MgY29ycmVjdG5lc3MKICAgICAg' + - 'ICByZXF1aXJlKGRuc0ludGVybmFsVmVyaWZ5KHN1YmRvbWFpbiksICJJbnZhbGlkIEROUyBuYW1lIik7CgogICAgICAgIC8vIFJlc29sdmUKICAgICAgICBsZXQgcmVz' + - 'OiBETlNSZXNvbHZlUmVzdWx0ID0gc2VsZi5kb1Jlc29sdmVETlMoc3ViZG9tYWluLCBjYXRlZ29yeSk7CiAgICAgICAgcmV0dXJuIEROU1Jlc29sdmVSZXN1bHR7cHJl' + - 'Zml4OiByZXMucHJlZml4ICsgZGVsdGEsIHJlY29yZDogcmVzLnJlY29yZH07CiAgICB9CgogICAgdmlydHVhbCBmdW4gZG9SZXNvbHZlRE5TKHN1YmRvbWFpbjogU2xp' + - 'Y2UsIGNhdGVnb3J5OiBJbnQpOiBETlNSZXNvbHZlUmVzdWx0IHsKICAgICAgICByZXR1cm4gRE5TUmVzb2x2ZVJlc3VsdHtwcmVmaXg6IHN1YmRvbWFpbi5iaXRzKCks' + - 'IHJlY29yZDogbnVsbH07CiAgICB9Cn0='; -files['libs/ownable.tact'] = - 'bWVzc2FnZSBDaGFuZ2VPd25lciB7CiAgICBxdWVyeUlkOiBJbnQgYXMgdWludDY0OwogICAgbmV3T3duZXI6IEFkZHJlc3M7Cn0KCm1lc3NhZ2UgQ2hhbmdlT3duZXJP' + - 'ayB7CiAgICBxdWVyeUlkOiBJbnQgYXMgdWludDY0OwogICAgbmV3T3duZXI6IEFkZHJlc3M7Cn0KCkBpbnRlcmZhY2UoIm9yZy50b24ub3duYWJsZSIpCnRyYWl0IE93' + - 'bmFibGUgewogICAgb3duZXI6IEFkZHJlc3M7CgogICAgZnVuIHJlcXVpcmVPd25lcigpIHsKICAgICAgICBuYXRpdmVUaHJvd1VubGVzcygxMzIsIHNlbmRlcigpID09' + - 'IHNlbGYub3duZXIpOwogICAgfQoKICAgIGdldCBmdW4gb3duZXIoKTogQWRkcmVzcyB7CiAgICAgICAgcmV0dXJuIHNlbGYub3duZXI7CiAgICB9Cn0KCkBpbnRlcmZh' + - 'Y2UoIm9yZy50b24ub3duYWJsZS50cmFuc2ZlcmFibGUudjIiKQp0cmFpdCBPd25hYmxlVHJhbnNmZXJhYmxlIHdpdGggT3duYWJsZSB7CgogICAgb3duZXI6IEFkZHJl' + - 'c3M7CgogICAgcmVjZWl2ZShtc2c6IENoYW5nZU93bmVyKSB7CiAgICAgICAgCiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlbmRlciBpcyB0aGUgb3duZXIKICAgICAg' + - 'ICBzZWxmLnJlcXVpcmVPd25lcigpOwoKICAgICAgICAvLyBVcGRhdGUgb3duZXIKICAgICAgICBzZWxmLm93bmVyID0gbXNnLm5ld093bmVyOwoKICAgICAgICAvLyBS' + - 'ZXBseSByZXN1bHQKICAgICAgICBzZWxmLnJlcGx5KENoYW5nZU93bmVyT2t7IHF1ZXJ5SWQ6IG1zZy5xdWVyeUlkLCBuZXdPd25lcjptc2cubmV3T3duZXIgfS50b0Nl' + - 'bGwoKSk7CiAgICB9Cn0='; -files['libs/stoppable.tact'] = - 'aW1wb3J0ICIuL293bmFibGUiOwoKQGludGVyZmFjZSgib3JnLnRvbi5zdG9wcGFibGUiKQp0cmFpdCBTdG9wcGFibGUgd2l0aCBPd25hYmxlIHsKICAgIAogICAgc3Rv' + - 'cHBlZDogQm9vbDsKICAgIG93bmVyOiBBZGRyZXNzOwoKICAgIGZ1biByZXF1aXJlTm90U3RvcHBlZCgpIHsKICAgICAgICByZXF1aXJlKCFzZWxmLnN0b3BwZWQsICJD' + - 'b250cmFjdCBzdG9wcGVkIik7CiAgICB9CgogICAgZnVuIHJlcXVpcmVTdG9wcGVkKCkgewogICAgICAgIHJlcXVpcmUoc2VsZi5zdG9wcGVkLCAiQ29udHJhY3Qgbm90' + - 'IHN0b3BwZWQiKTsKICAgIH0KCiAgICByZWNlaXZlKCJTdG9wIikgewogICAgICAgIHNlbGYucmVxdWlyZU93bmVyKCk7CiAgICAgICAgc2VsZi5yZXF1aXJlTm90U3Rv' + - 'cHBlZCgpOwogICAgICAgIHNlbGYuc3RvcHBlZCA9IHRydWU7CiAgICAgICAgc2VsZi5yZXBseSgiU3RvcHBlZCIuYXNDb21tZW50KCkpOwogICAgfQoKICAgIGdldCBm' + - 'dW4gc3RvcHBlZCgpOiBCb29sIHsKICAgICAgICByZXR1cm4gc2VsZi5zdG9wcGVkOwogICAgfQp9CgpAaW50ZXJmYWNlKCJvcmcudG9uLnJlc3VtYWJsZSIpCnRyYWl0' + - 'IFJlc3VtYWJsZSB3aXRoIFN0b3BwYWJsZSB7CiAgICBzdG9wcGVkOiBCb29sOwogICAgb3duZXI6IEFkZHJlc3M7CgogICAgcmVjZWl2ZSgiUmVzdW1lIikgewogICAg' + - 'ICAgIHNlbGYucmVxdWlyZU93bmVyKCk7CiAgICAgICAgc2VsZi5yZXF1aXJlU3RvcHBlZCgpOwogICAgICAgIHNlbGYuc3RvcHBlZCA9IGZhbHNlOwogICAgICAgIHNl' + - 'bGYucmVwbHkoIlJlc3VtZWQiLmFzQ29tbWVudCgpKTsKICAgIH0KfQ=='; -files['std/base.tact'] = - 'dHJhaXQgQmFzZVRyYWl0IHsKICAgIHZpcnR1YWwgY29uc3Qgc3RvcmFnZVJlc2VydmU6IEludCA9IDA7CiAgICAKICAgIHZpcnR1YWwgaW5saW5lIGZ1biByZXBseShi' + - 'b2R5OiBDZWxsPykgewogICAgICAgIHNlbGYuZm9yd2FyZChzZW5kZXIoKSwgYm9keSwgdHJ1ZSwgbnVsbCk7CiAgICB9CgogICAgdmlydHVhbCBpbmxpbmUgZnVuIG5v' + - 'dGlmeShib2R5OiBDZWxsPykgewogICAgICAgIHNlbGYuZm9yd2FyZChzZW5kZXIoKSwgYm9keSwgZmFsc2UsIG51bGwpOwogICAgfQoKICAgIHZpcnR1YWwgZnVuIGZv' + - 'cndhcmQodG86IEFkZHJlc3MsIGJvZHk6IENlbGw/LCBib3VuY2U6IEJvb2wsIGluaXQ6IFN0YXRlSW5pdD8pIHsKCiAgICAgICAgbGV0IGNvZGU6IENlbGw/ID0gbnVs' + - 'bDsKICAgICAgICBsZXQgZGF0YTogQ2VsbD8gPSBudWxsOwogICAgICAgIGlmIChpbml0ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGluaXQyOiBTdGF0ZUluaXQg' + - 'PSBpbml0ISE7CiAgICAgICAgICAgIGNvZGUgPSBpbml0Mi5jb2RlOwogICAgICAgICAgICBkYXRhID0gaW5pdDIuZGF0YTsKICAgICAgICB9CgogICAgICAgIC8vIExv' + - 'Y2sgc3RvcmFnZSBpZiBuZWVkZWQKICAgICAgICBpZiAoc2VsZi5zdG9yYWdlUmVzZXJ2ZSA+IDApIHsgLy8gT3B0aW1pemVkIGluIGNvbXBpbGUtdGltZQogICAgICAg' + - 'ICAgICBsZXQgY3R4OiBDb250ZXh0ID0gY29udGV4dCgpOwogICAgICAgICAgICBsZXQgYmFsYW5jZTogSW50ID0gbXlCYWxhbmNlKCk7CiAgICAgICAgICAgIGxldCBi' + - 'YWxhbmNlQmVmb3JlTWVzc2FnZTogSW50ID0gYmFsYW5jZSAtIGN0eC52YWx1ZTsKICAgICAgICAgICAgaWYgKGJhbGFuY2VCZWZvcmVNZXNzYWdlIDwgc2VsZi5zdG9y' + - 'YWdlUmVzZXJ2ZSkgewogICAgICAgICAgICAgICAgbmF0aXZlUmVzZXJ2ZShzZWxmLnN0b3JhZ2VSZXNlcnZlLCBSZXNlcnZlRXhhY3QpOwogICAgICAgICAgICAgICAg' + - 'c2VuZChTZW5kUGFyYW1ldGVyc3tib3VuY2U6IGJvdW5jZSwgdG86IHRvLCB2YWx1ZTogMCwgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UgfCBTZW5kSWdub3JlRXJy' + - 'b3JzLCBib2R5OiBib2R5LCBjb2RlOiBjb2RlLCBkYXRhOiBkYXRhIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAg' + - 'ICAgICAvLyBKdXN0IHNlbmQgd2l0aCByZW1haW5pbmcgYmFsYW5jZQogICAgICAgIHNlbmQoU2VuZFBhcmFtZXRlcnN7Ym91bmNlOiBib3VuY2UsIHRvOiB0bywgdmFs' + - 'dWU6IDAsIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJvcnMsIGJvZHk6IGJvZHksIGNvZGU6IGNvZGUsIGRhdGE6IGRhdGEgfSk7CiAgICB9' + - 'Cn0='; -files['std/cells.tact'] = - 'Ly8KLy8gQnVpbGRlcgovLwoKYXNtIGZ1biBiZWdpbkNlbGwoKTogQnVpbGRlciB7IE5FV0MgfQoKLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwg' + - 'c28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJTVElYIgpAbmFtZShzdG9yZV9pbnQpCmV4dGVuZHMgbmF0aXZlIHN0b3JlSW50KHNlbGY6IEJ1aWxkZXIsIHZhbHVlOiBJ' + - 'bnQsIGJpdHM6IEludCk6IEJ1aWxkZXI7CgovLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVyLCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIlNUVVgi' + - 'CkBuYW1lKHN0b3JlX3VpbnQpCmV4dGVuZHMgbmF0aXZlIHN0b3JlVWludChzZWxmOiBCdWlsZGVyLCB2YWx1ZTogSW50LCBiaXRzOiBJbnQpOiBCdWlsZGVyOwoKQG5h' + - 'bWUoX190YWN0X3N0b3JlX2Jvb2wpCmV4dGVuZHMgbmF0aXZlIHN0b3JlQm9vbChzZWxmOiBCdWlsZGVyLCB2YWx1ZTogQm9vbCk6IEJ1aWxkZXI7CgovLy8gRXh0ZW5z' + - 'aW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgLiBBbGlhcyB0byBgQnVpbGRlci5zdG9yZUJvb2woKWAuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgovLy8K' + - 'Ly8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJ1aWxkZXIg' + - 'PSBiLnN0b3JlQml0KHRydWUpOyAgLy8gd3JpdGVzIDEKLy8vICAgICBsZXQgYnV6ejogQnVpbGRlciA9IGIuc3RvcmVCaXQoZmFsc2UpOyAvLyB3cml0ZXMgMAovLy8g' + - 'fQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmViaXQKLy8vCkBuYW1lKF9fdGFj' + - 'dF9zdG9yZV9ib29sKQpleHRlbmRzIG5hdGl2ZSBzdG9yZUJpdChzZWxmOiBCdWlsZGVyLCB2YWx1ZTogQm9vbCk6IEJ1aWxkZXI7Cgphc20gZXh0ZW5kcyBmdW4gc3Rv' + - 'cmVDb2lucyhzZWxmOiBCdWlsZGVyLCB2YWx1ZTogSW50KTogQnVpbGRlciB7IFNUVkFSVUlOVDE2IH0KCmFzbSBleHRlbmRzIGZ1biBzdG9yZVZhckludDE2KHNlbGY6' + - 'IEJ1aWxkZXIsIHZhbHVlOiBJbnQpOiBCdWlsZGVyIHsgU1RWQVJJTlQxNiB9Cgphc20gZXh0ZW5kcyBmdW4gc3RvcmVWYXJJbnQzMihzZWxmOiBCdWlsZGVyLCB2YWx1' + - 'ZTogSW50KTogQnVpbGRlciB7IFNUVkFSSU5UMzIgfQoKYXNtIGV4dGVuZHMgZnVuIHN0b3JlVmFyVWludDE2KHNlbGY6IEJ1aWxkZXIsIHZhbHVlOiBJbnQpOiBCdWls' + - 'ZGVyIHsgU1RWQVJVSU5UMTYgfQoKYXNtIGV4dGVuZHMgZnVuIHN0b3JlVmFyVWludDMyKHNlbGY6IEJ1aWxkZXIsIHZhbHVlOiBJbnQpOiBCdWlsZGVyIHsgU1RWQVJV' + - 'SU5UMzIgfQoKYXNtKGNlbGwgc2VsZikgZXh0ZW5kcyBmdW4gc3RvcmVSZWYoc2VsZjogQnVpbGRlciwgY2VsbDogQ2VsbCk6IEJ1aWxkZXIgeyBTVFJFRiB9Cgphc20g' + - 'ZXh0ZW5kcyBmdW4gc3RvcmVTbGljZShzZWxmOiBCdWlsZGVyLCBjZWxsOiBTbGljZSk6IEJ1aWxkZXIgeyBTVFNMSUNFUiB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9u' + - 'IGZvciB0aGUgYEJ1aWxkZXJgLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBBcHBlbmRzIGFsbCBkYXRhIGZyb20gYSBgQnVpbGRlcmAgYGNlbGxg' + - 'IHRvIHRoZSBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuIFJldHVybnMgdGhhdCBjb3B5LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxl' + - 'dCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCkuc3RvcmVDb2lucyg0Mik7Ci8vLyAgICAgbGV0IGZpeno6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKS5zdG9yZUJ1aWxkZXIo' + - 'Yik7Ci8vLyAgICAgYi5lbmRDZWxsKCkgPT0gZml6ei5lbmRDZWxsKCk7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3Qt' + - 'bGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcnN0b3JlYnVpbGRlcgovLy8KYXNtIGV4dGVuZHMgZnVuIHN0b3JlQnVpbGRlcihzZWxmOiBCdWlsZGVyLCBjZWxs' + - 'OiBCdWlsZGVyKTogQnVpbGRlciB7IFNUQlIgfQoKQG5hbWUoX190YWN0X3N0b3JlX2FkZHJlc3MpCmV4dGVuZHMgbmF0aXZlIHN0b3JlQWRkcmVzcyhzZWxmOiBCdWls' + - 'ZGVyLCBhZGRyZXNzOiBBZGRyZXNzKTogQnVpbGRlcjsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAuIEF2YWlsYWJsZSBzaW5jZSBUYWN0' + - 'IDEuNS4wLgovLy8KLy8vIElmIHRoZSBgY2VsbGAgaXMgbm90IGBudWxsYCwgc3RvcmVzIDEgYXMgYSBzaW5nbGUgYml0IGFuZCB0aGVuIHJlZmVyZW5jZSBgY2VsbGAg' + - 'aW50byB0aGUgY29weSBvZiB0aGUgYEJ1aWxkZXJgLiBSZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBJZiB0aGUgYGNlbGxgIGlzIGBudWxsYCwgb25seSBzdG9yZXMg' + - 'MCBhcyBhIHNpbmdsZSBiaXQgaW50byB0aGUgY29weSBvZiB0aGUgYEJ1aWxkZXJgLiBSZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBBcyBhIHNpbmdsZSBgQ2VsbGAg' + - 'Y2FuIHN0b3JlIHVwIHRvIDQgcmVmZXJlbmNlcywgYXR0ZW1wdHMgdG8gc3RvcmUgbW9yZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgODogYENlbGwg' + - 'b3ZlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0' + - 'IGZpeno6IEJ1aWxkZXIgPSBiCi8vLyAgICAgICAgIC5zdG9yZU1heWJlUmVmKGVtcHR5Q2VsbCgpKSAvLyAxLCB0aGVuIGVtcHR5IGNlbGwKLy8vICAgICAgICAgLnN0' + - 'b3JlTWF5YmVSZWYobnVsbCk7ICAgICAgIC8vIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2Vs' + - 'bHMjYnVpbGRlcnN0b3JlbWF5YmVyZWYKLy8vCmFzbShjZWxsIHNlbGYpIGV4dGVuZHMgZnVuIHN0b3JlTWF5YmVSZWYoc2VsZjogQnVpbGRlciwgY2VsbDogQ2VsbD8p' + - 'OiBCdWlsZGVyIHsgU1RPUFRSRUYgfQoKYXNtIGV4dGVuZHMgZnVuIGVuZENlbGwoc2VsZjogQnVpbGRlcik6IENlbGwgeyBFTkRDIH0KCmFzbSBleHRlbmRzIGZ1biBy' + - 'ZWZzKHNlbGY6IEJ1aWxkZXIpOiBJbnQgeyBCUkVGUyB9Cgphc20gZXh0ZW5kcyBmdW4gYml0cyhzZWxmOiBCdWlsZGVyKTogSW50IHsgQkJJVFMgfQoKLy8KLy8gU2xp' + - 'Y2UKLy8KCmFzbSBleHRlbmRzIGZ1biBiZWdpblBhcnNlKHNlbGY6IENlbGwpOiBTbGljZSB7IENUT1MgfQoKYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBs' + - 'b2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IExEUkVGIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgLiBBdmFpbGFibGUgc2luY2UgVGFj' + - 'dCAxLjUuMC4KLy8vCi8vLyBQcmVsb2FkcyB0aGUgbmV4dCByZWZlcmVuY2UgZnJvbSB0aGUgYFNsaWNlYCBhcyBhIGBDZWxsYC4gRG9lc24ndCBtb2RpZnkgdGhlIG9y' + - 'aWdpbmFsIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBzdWNoIHJlZmVyZW5jZSBgQ2VsbGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBp' + - 'dCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgODogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHByZWxvYWQgbW9yZSBkYXRhIHRo' + - 'YW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBm' + - 'dW4gZXhhbXBsZXMoKSB7Ci8vLyAgICAgbGV0IHMxOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0' + - 'IGZpeno6IENlbGwgPSBzMS5wcmVsb2FkUmVmKCk7IC8vIGRpZG4ndCBtb2RpZnkgczEKLy8vCi8vLyAgICAgbGV0IHMyOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAg' + - 'ICAgICAgIC5zdG9yZVJlZihlbXB0eUNlbGwoKSkKLy8vICAgICAgICAgLnN0b3JlUmVmKHMxLmFzQ2VsbCgpKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8gICAg' + - 'IGxldCByZWYxOiBDZWxsID0gczIucHJlbG9hZFJlZigpOwovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIucHJlbG9hZFJlZigpOwovLy8gICAgIHJlZjEgPT0gcmVm' + - 'MjsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXByZWxv' + - 'YWRyZWYKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwphc20gZXh0ZW5kcyBmdW4gcHJlbG9hZFJlZihzZWxmOiBTbGlj' + - 'ZSk6IENlbGwgeyBQTERSRUYgfQoKLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJMRFNMSUNFWCIK' + - 'QG5hbWUobG9hZF9iaXRzKQpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBTbGljZTsKCi8vIHNwZWNpYWwgdHJlYXRt' + - 'ZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiUExEU0xJQ0VYIgpAbmFtZShwcmVsb2FkX2JpdHMpCmV4dGVuZHMgbmF0aXZlIHBy' + - 'ZWxvYWRCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBTbGljZTsKCi8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3' + - 'aXRoIGFzbSAiTERJWCIKQG5hbWUobG9hZF9pbnQpCmV4dGVuZHMgbXV0YXRlcyBuYXRpdmUgbG9hZEludChzZWxmOiBTbGljZSwgbDogSW50KTogSW50OwoKLy8gc3Bl' + - 'Y2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERJWCIKQG5hbWUocHJlbG9hZF9pbnQpCmV4dGVuZHMgbmF0' + - 'aXZlIHByZWxvYWRJbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNl' + - 'ZCB3aXRoIGFzbSAiTERVWCIKQG5hbWUobG9hZF91aW50KQpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRVaW50KHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBJbnQ7Cgov' + - 'LyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVyLCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIlBMRFVYIgpAbmFtZShwcmVsb2FkX3VpbnQpCmV4dGVu' + - 'ZHMgbmF0aXZlIHByZWxvYWRVaW50KHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBJbnQ7Cgphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRCb29sKHNlbGY6' + - 'IFNsaWNlKTogQm9vbCB7IDEgTERJIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgLiBBbGlhcyB0byBgU2xpY2UubG9hZEJv' + - 'b2woKWAuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJl' + - 'Z2luQ2VsbCgpLnN0b3JlQm9vbCh0cnVlKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmxvYWRCaXQoKTsgLy8gdHJ1ZQovLy8gfQovLy8gYGBg' + - 'Ci8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRiaXQKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0' + - 'YXRlcyBmdW4gbG9hZEJpdChzZWxmOiBTbGljZSk6IEJvb2wgeyAxIExESSB9Cgphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkQ29pbnMoc2VsZjog' + - 'U2xpY2UpOiBJbnQgeyBMRFZBUlVJTlQxNiB9CgpAbmFtZShfX3RhY3RfbG9hZF9hZGRyZXNzKQpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRBZGRyZXNzKHNlbGY6' + - 'IFNsaWNlKTogQWRkcmVzczsKCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpIHsgU0RTS0lQRklSU1QgfQoKYXNtIGV4' + - 'dGVuZHMgZnVuIGVuZFBhcnNlKHNlbGY6IFNsaWNlKSB7IEVORFMgfQoKLy8KLy8gU2xpY2Ugc2l6ZQovLwoKYXNtIGV4dGVuZHMgZnVuIHJlZnMoc2VsZjogU2xpY2Up' + - 'OiBJbnQgeyBTUkVGUyB9Cgphc20gZXh0ZW5kcyBmdW4gYml0cyhzZWxmOiBTbGljZSk6IEludCB7IFNCSVRTIH0KCmFzbSBleHRlbmRzIGZ1biBlbXB0eShzZWxmOiBT' + - 'bGljZSk6IEJvb2wgeyBTRU1QVFkgfQoKYXNtIGV4dGVuZHMgZnVuIGRhdGFFbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTREVNUFRZIH0KCmFzbSBleHRlbmRzIGZ1' + - 'biByZWZzRW1wdHkoc2VsZjogU2xpY2UpOiBCb29sIHsgU1JFTVBUWSB9CgovLwovLyBDb252ZXJzaW9ucwovLwoKaW5saW5lIGV4dGVuZHMgZnVuIGFzU2xpY2Uoc2Vs' + - 'ZjogQnVpbGRlcik6IFNsaWNlIHsKICAgIHJldHVybiBzZWxmLmVuZENlbGwoKS5iZWdpblBhcnNlKCk7Cn0KCmlubGluZSBleHRlbmRzIGZ1biBhc1NsaWNlKHNlbGY6' + - 'IENlbGwpOiBTbGljZSB7CiAgICByZXR1cm4gc2VsZi5iZWdpblBhcnNlKCk7Cn0KCmlubGluZSBleHRlbmRzIGZ1biBhc0NlbGwoc2VsZjogU2xpY2UpOiBDZWxsIHsK' + - 'ICAgIHJldHVybiBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVNsaWNlKHNlbGYpCiAgICAgICAgLmVuZENlbGwoKTsKfQoKaW5saW5lIGV4dGVuZHMgZnVuIGFzQ2Vs' + - 'bChzZWxmOiBCdWlsZGVyKTogQ2VsbCB7CiAgICByZXR1cm4gc2VsZi5lbmRDZWxsKCk7Cn0KCmlubGluZSBmdW4gZW1wdHlDZWxsKCk6IENlbGwgewogICAgcmV0dXJu' + - 'IGJlZ2luQ2VsbCgpLmVuZENlbGwoKTsKfQoKaW5saW5lIGZ1biBlbXB0eVNsaWNlKCk6IFNsaWNlIHsKICAgIHJldHVybiBlbXB0eUNlbGwoKS5hc1NsaWNlKCk7Cn0K'; -files['std/config.tact'] = - 'YXNtIGZ1biBnZXRDb25maWdQYXJhbShpZDogSW50KTogQ2VsbD8geyBDT05GSUdPUFRQQVJBTSB9Cg=='; -files['std/context.tact'] = - 'c3RydWN0IENvbnRleHQgewogICAgYm91bmNlZDogQm9vbDsKICAgIHNlbmRlcjogQWRkcmVzczsKICAgIHZhbHVlOiBJbnQ7CiAgICByYXc6IFNsaWNlOwp9CgpAbmFt' + - 'ZShfX3RhY3RfY29udGV4dF9nZXQpCm5hdGl2ZSBjb250ZXh0KCk6IENvbnRleHQ7CgpAbmFtZShfX3RhY3RfY29udGV4dF9nZXRfc2VuZGVyKQpuYXRpdmUgc2VuZGVy' + - 'KCk6IEFkZHJlc3M7CgpleHRlbmRzIGZ1biByZWFkRm9yd2FyZEZlZShzZWxmOiBDb250ZXh0KTogSW50IHsKICAgIGxldCBzYzogU2xpY2UgPSBzZWxmLnJhdzsKICAg' + - 'IHNjLmxvYWRBZGRyZXNzKCk7IC8vIFNraXAgZGVzdGluYXRpb24KICAgIHNjLmxvYWRDb2lucygpOyAvLyBTa2lwIHZhbHVlCiAgICBzYy5za2lwQml0cygxKTsgLy8g' + - 'U2tpcCBleHRyYSBjdXJyZW5jeSBjb2xsZWN0aW9uCiAgICBzYy5sb2FkQ29pbnMoKTsgLy8gU2tpcCBpaHJfZmVlCiAgICByZXR1cm4gKHNjLmxvYWRDb2lucygpICog' + - 'MykgLyAyOwp9'; -files['std/contract.tact'] = - 'c3RydWN0IFN0YXRlSW5pdCB7CiAgICBjb2RlOiBDZWxsOwogICAgZGF0YTogQ2VsbDsKfQoKQG5hbWUoX190YWN0X2NvbXB1dGVfY29udHJhY3RfYWRkcmVzcykKbmF0' + - 'aXZlIGNvbnRyYWN0QWRkcmVzc0V4dChjaGFpbjogSW50LCBjb2RlOiBDZWxsLCBkYXRhOiBDZWxsKTogQWRkcmVzczsKCmlubGluZSBmdW4gY29udHJhY3RBZGRyZXNz' + - 'KHM6IFN0YXRlSW5pdCk6IEFkZHJlc3MgewogICAgcmV0dXJuIGNvbnRyYWN0QWRkcmVzc0V4dCgwLCBzLmNvZGUsIHMuZGF0YSk7Cn0KCkBuYW1lKF9fdGFjdF9hZGRy' + - 'ZXNzX3RvX3NsaWNlKQpleHRlbmRzIG5hdGl2ZSBhc1NsaWNlKHNlbGY6IEFkZHJlc3MpOiBTbGljZTsKCkBuYW1lKF9fdGFjdF9jcmVhdGVfYWRkcmVzcykKbmF0aXZl' + - 'IG5ld0FkZHJlc3MoY2hhaW46IEludCwgaGFzaDogSW50KTogQWRkcmVzczsKCmFzbSBmdW4gbXlBZGRyZXNzKCk6IEFkZHJlc3MgeyBNWUFERFIgfQoKYXNtIGZ1biBt' + - 'eUJhbGFuY2UoKTogSW50IHsgQkFMQU5DRSBGSVJTVCB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBSZXR1' + - 'cm5zIHRoZSBuYW5vVG9uY29pbiBgSW50YCBhbW91bnQgb2YgZ2FzIGNvbnN1bWVkIGJ5IFRWTSBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBzbyBmYXIuIFRoZSBy' + - 'ZXN1bHRpbmcgdmFsdWUgaW5jbHVkZXMgdGhlIGNvc3Qgb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewov' + - 'Ly8gICAgIGxldCBnYXM6IEludCA9IGdhc0NvbnN1bWVkKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9j' + - 'b3JlLWFkdmFuY2VkI2dhc2NvbnN1bWVkCi8vLwphc20gZnVuIGdhc0NvbnN1bWVkKCk6IEludCB7IEdBU0NPTlNVTUVEIH0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2' + - 'YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgovLy8KLy8vIFJldHVybnMgdGhlIG5hbm9Ub25jb2luIGBJbnRgIGFtb3VudCBvZiB0aGUgYWNjdW11bGF0ZWQgc3RvcmFn' + - 'ZSBmZWUgZGVidC4gU3RvcmFnZSBmZWVzIGFyZSBkZWR1Y3RlZCBmcm9tIHRoZSBpbmNvbWluZyBtZXNzYWdlIHZhbHVlIGJlZm9yZSB0aGUgbmV3IGNvbnRyYWN0IGJh' + - 'bGFuY2UgaXMgY2FsY3VsYXRlZC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgZGVidDogSW50ID0gbXlTdG9yYWdlRHVlKCk7' + - 'Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkdmFuY2VkI215c3RvcmFnZWR1ZQovLy8KYXNtIGZ1' + - 'biBteVN0b3JhZ2VEdWUoKTogSW50IHsgRFVFUEFZTUVOVCB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBD' + - 'YWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBzdG9yYWdlIGZlZSBpbiBuYW5vVG9uY29pbnMgYEludGAgZm9yIHN0b3JpbmcgYSBjb250cmFjdCB3aXRoIGEgZ2l2ZW4g' + - 'bnVtYmVyIG9mIGBjZWxsc2AgYW5kIGBiaXRzYCBmb3IgYSBudW1iZXIgb2YgYHNlY29uZHNgLiBVc2VzIHRoZSBwcmljZXMgb2YgdGhlIG1hc3RlcmNoYWluIGlmIGBp' + - 'c01hc3RlcmNoYWluYCBpcyBgdHJ1ZWAsIG90aGVyd2lzZSB0aGUgcHJpY2VzIG9mIHRoZSBiYXNlY2hhaW4uIFRoZSBjdXJyZW50IHByaWNlcyBhcmUgb2J0YWluZWQg' + - 'ZnJvbSB0aGUgY29uZmlnIHBhcmFtIDE4IG9mIFRPTiBCbG9ja2NoYWluLgovLy8KLy8vIE5vdGUsIHRoYXQgdGhlIHZhbHVlcyBvZiBgY2VsbHNgIGFuZCBgYml0c2Ag' + - 'YXJlIHRha2VuIG1vZHVsbyB0aGVpciBtYXhpbXVtIHZhbHVlcyBwbHVzIDEuIFRoYXQgaXMsIHNwZWNpZnlpbmcgdmFsdWVzIGhpZ2hlciB0aGFuIHRob3NlIGxpc3Rl' + - 'ZCBpbiBhY2NvdW50IHN0YXRlIGxpbWl0cyAoYG1heF9hY2Nfc3RhdGVfY2VsbHNgIGFuZCBgbWF4X2FjY19zdGF0ZV9iaXRzYCkgd2lsbCBoYXZlIHRoZSBzYW1lIHJl' + - 'c3VsdCBhcyB3aXRoIHNwZWNpZnlpbmcgdGhlIGV4YWN0IGxpbWl0cy4gSW4gYWRkaXRpb24sIG1ha2Ugc3VyZSB5b3UgdGFrZSBpbnRvIGFjY291bnQgdGhlIGRlZHVw' + - 'bGljYXRpb24gb2YgY2VsbHMgd2l0aCB0aGUgc2FtZSBoYXNoLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgbmVnYXRpdmUgbnVtYmVyIG9mIGBjZWxsc2AsIGBi' + - 'aXRzYCBvciBgc2Vjb25kc2AgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDU6IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8g' + - 'YGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGZlZTogSW50ID0gZ2V0U3RvcmFnZUZlZSgxXzAwMCwgMV8wMDAsIDFfMDAwLCBmYWxzZSk7Ci8v' + - 'LyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkdmFuY2VkI2dldHN0b3JhZ2VmZWUKLy8vICog' + - 'aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0c2ltcGxlc3RvcmFnZWZlZQovLy8KYXNtIGZ1biBnZXRTdG9yYWdlRmVlKGNlbGxz' + - 'OiBJbnQsIGJpdHM6IEludCwgc2Vjb25kczogSW50LCBpc01hc3RlcmNoYWluOiBCb29sKTogSW50IHsgR0VUU1RPUkFHRUZFRSB9CgovLy8gR2xvYmFsIGZ1bmN0aW9u' + - 'LiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBjb21wdXRlIGZlZSBpbiBuYW5vVG9uY29pbnMgYElu' + - 'dGAgZm9yIGEgdHJhbnNhY3Rpb24gdGhhdCBjb25zdW1lZCBgZ2FzVXNlZGAgYW1vdW50IG9mIGdhcy4gVXNlcyB0aGUgcHJpY2VzIG9mIHRoZSBtYXN0ZXJjaGFpbiBp' + - 'ZiBgaXNNYXN0ZXJjaGFpbmAgaXMgYHRydWVgLCBvdGhlcndpc2UgdGhlIHByaWNlcyBvZiB0aGUgYmFzZWNoYWluLiBUaGUgY3VycmVudCBwcmljZXMgYXJlIG9idGFp' + - 'bmVkIGZyb20gdGhlIGNvbmZpZyBwYXJhbSAyMCBmb3IgdGhlIG1hc3RlcmNoYWluIGFuZCBjb25maWcgcGFyYW0gMjEgZm9yIHRoZSBiYXNlY2hhaW4gb2YgVE9OIEJs' + - 'b2NrY2hhaW4uCi8vLwovLy8gV2hlbiB0aGUgYGdhc1VzZWRgIGlzIGxlc3MgdGhhbiBhIGNlcnRhaW4gdGhyZXNob2xkIGNhbGxlZCBgZmxhdF9nYXNfbGltaXRgLCB0' + - 'aGVyZSdzIGEgbWluaW11bSBwcmljZSB0byBwYXkgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGBmbGF0X2dhc19wcmljZWAuIFRoZSBsZXNzIGdhcyBpcyB1c2VkIGJlbG93' + - 'IHRoaXMgdGhyZXNob2xkLCB0aGUgaGlnaGVyIHRoZSBtaW5pbXVtIHByaWNlIHdpbGwgYmUuIFNlZSB0aGUgZXhhbXBsZSBmb3IgYGdldFNpbXBsZUNvbXB1dGVGZWUo' + - 'KWAgdG8gZGVyaXZlIHRoYXQgdGhyZXNob2xkLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgbmVnYXRpdmUgdmFsdWUgb2YgYGdhc1VzZWRgIHRocm93IGFuIGV4' + - 'Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA1OiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewov' + - 'Ly8gICAgIGxldCBmZWU6IEludCA9IGdldENvbXB1dGVGZWUoMV8wMDAsIGZhbHNlKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3Qt' + - 'bGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0Y29tcHV0ZWZlZQovLy8KYXNtIGZ1biBnZXRDb21wdXRlRmVlKGdhc1VzZWQ6IEludCwgaXNNYXN0ZXJjaGFpbjog' + - 'Qm9vbCk6IEludCB7IEdFVEdBU0ZFRSB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBTaW1pbGFyIHRvIGBn' + - 'ZXRDb21wdXRlRmVlKClgLCBidXQgd2l0aG91dCB0aGUgYGZsYXRfZ2FzX3ByaWNlYCwgaS5lLiB3aXRob3V0IGEgbWluaW11bSBwcmljZSB0byBwYXkgaWYgdGhlIGBn' + - 'YXNVc2VkYCBpcyBsZXNzIHRoYW4gYSBjZXJ0YWluIHRocmVzaG9sZCBjYWxsZWQgYGZsYXRfZ2FzX2xpbWl0YC4gQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyBvbmx5IHRo' + - 'ZSBgZ2FzVXNlZGAgdGltZXMgdGhlIGN1cnJlbnQgZ2FzIHByaWNlLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgbmVnYXRpdmUgbnVtYmVyIG9mIGBjZWxsc2As' + - 'IGBiaXRzYCBvciBgc2Vjb25kc2AgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDU6IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwov' + - 'Ly8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGZlZSA9IGdldENvbXB1dGVGZWUoMCwgZmFsc2UpOwovLy8gICAgIGxldCBmZWVOb0ZsYXQg' + - 'PSBnZXRTaW1wbGVDb21wdXRlRmVlKDAsIGZhbHNlKTsKLy8vICAgICBsZXQgbWF4RmxhdFByaWNlID0gZmVlIC0gZmVlTm9GbGF0OwovLy8gfQovLy8gYGBgCi8vLwov' + - 'Ly8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1hZHZhbmNlZCNnZXRzaW1wbGVzdG9yYWdlZmVlCi8vLyAqIGh0dHBzOi8vZG9j' + - 'cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkdmFuY2VkI2dldHN0b3JhZ2VmZWUKLy8vCmFzbSBmdW4gZ2V0U2ltcGxlQ29tcHV0ZUZlZShnYXNVc2VkOiBJbnQsIGlz' + - 'TWFzdGVyY2hhaW46IEJvb2wpOiBJbnQgeyBHRVRHQVNGRUVTSU1QTEUgfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8v' + - 'LwovLy8gQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgZm9yd2FyZCBmZWUgaW4gbmFub1RvbmNvaW5zIGBJbnRgIGZvciBhbiBvdXRnb2luZyBtZXNzYWdlIGNvbnNp' + - 'c3Rpbmcgb2YgYSBnaXZlbiBudW1iZXIgb2YgYGNlbGxzYCBhbmQgYGJpdHNgLiBVc2VzIHRoZSBwcmljZXMgb2YgdGhlIG1hc3RlcmNoYWluIGlmIGBpc01hc3RlcmNo' + - 'YWluYCBpcyBgdHJ1ZXs6dGFjdH1gLCBvdGhlcndpc2UgdGhlIHByaWNlcyBvZiB0aGUgYmFzZWNoYWluLiBUaGUgY3VycmVudCBwcmljZXMgYXJlIG9idGFpbmVkIGZy' + - 'b20gdGhlIGNvbmZpZyBwYXJhbSAyNCBmb3IgdGhlIG1hc3RlcmNoYWluIGFuZCBjb25maWcgcGFyYW0gMjUgZm9yIHRoZSBiYXNlY2hhaW4gb2YgVE9OIEJsb2NrY2hh' + - 'aW4uCi8vLwovLy8gSWYgYm90aCB0aGUgc291cmNlIGFuZCB0aGUgZGVzdGluYXRpb24gYWRkcmVzc2VzIGFyZSBpbiB0aGUgYmFzZWNoYWluLCB0aGVuIHNwZWNpZnkg' + - 'YGlzTWFzdGVyY2hhaW5gIGFzIGBmYWxzZWAuIE90aGVyd2lzZSwgc3BlY2lmeSBgdHJ1ZWAuCi8vLwovLy8gTm90ZSwgdGhhdCB0aGUgdmFsdWVzIG9mIGBjZWxsc2Ag' + - 'YW5kIGBiaXRzYCBhcmUgdGFrZW4gbW9kdWxvIHRoZWlyIG1heGltdW0gdmFsdWVzIHBsdXMgMS4gVGhhdCBpcywgc3BlY2lmeWluZyB2YWx1ZXMgaGlnaGVyIHRoYW4g' + - 'dGhvc2UgbGlzdGVkIGluIGFjY291bnQgc3RhdGUgbGltaXRzIChgbWF4X21zZ19jZWxsc2AgYW5kIGBtYXhfbXNnX2JpdHNgKSB3aWxsIGhhdmUgdGhlIHNhbWUgcmVz' + - 'dWx0IGFzIHdpdGggc3BlY2lmeWluZyB0aGUgZXhhY3QgbGltaXRzLgovLy8KLy8vIEhvd2V2ZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlcyBvZiBgY2VsbHNgIGFu' + - 'ZCBgYml0c2AsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIGFkZHMgdGhlIG1pbmltdW0gcHJpY2UgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGBsdW1wX3ByaWNlYC4gU2VlIHRo' + - 'ZSBleGFtcGxlIGZvciBbYGdldFNpbXBsZUZvcndhcmRGZWUoKXs6dGFjdH1gXSgjZ2V0c2ltcGxlZm9yd2FyZGZlZSkgdG8gZGVyaXZlIGl0LiBJbiBhZGRpdGlvbiwg' + - 'bWFrZSBzdXJlIHlvdSB0YWtlIGludG8gYWNjb3VudCB0aGUgZGVkdXBsaWNhdGlvbiBvZiBjZWxscyB3aXRoIHRoZSBzYW1lIGhhc2gsIHNpbmNlIGZvciBleGFtcGxl' + - 'IHRoZSByb290IGNlbGwgYW5kIGl0cyBkYXRhIGJpdHMgZG9uJ3QgY291bnQgdG93YXJkcyB0aGUgZm9yd2FyZCBmZWUgYW5kIGFyZSBjb3ZlcmVkIGJ5IHRoZSBgbHVt' + - 'cF9wcmljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBuZWdhdGl2ZSBudW1iZXIgb2YgYGNlbGxzYCBvciBgYml0c2AgdGhyb3cgYW4gZXhjZXB0aW9uIHdp' + - 'dGggZXhpdCBjb2RlIDU6IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0' + - 'IGZlZTogSW50ID0gZ2V0Rm9yd2FyZEZlZSgxXzAwMCwgMV8wMDAsIGZhbHNlKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRh' + - 'Y3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0Zm9yd2FyZGZlZQovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1hZHZhbmNlZCNn' + - 'ZXRzaW1wbGVmb3J3YXJkZmVlCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkdmFuY2VkI2dldG9yaWdpbmFsZndkZmVlCi8vLwphc20g' + - 'ZnVuIGdldEZvcndhcmRGZWUoY2VsbHM6IEludCwgYml0czogSW50LCBpc01hc3RlcmNoYWluOiBCb29sKTogSW50IHsgR0VURk9SV0FSREZFRSB9CgovLy8gR2xvYmFs' + - 'IGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBTaW1pbGFyIHRvIGBnZXRGb3J3YXJkRmVlKClgLCBidXQgd2l0aG91dCB0aGUgYGx1' + - 'bXBfcHJpY2VgLCBpLmUuIHdpdGhvdXQgdGhlIG1pbmltdW0gcHJpY2UgdG8gcGF5IHJlZ2FyZGxlc3Mgb2YgdGhlIGFtb3VudCBvZiBgY2VsbHNgIG9yIGBiaXRzYC4g' + - 'Q2FsY3VsYXRlcyBhbmQgcmV0dXJucyBvbmx5IHRoZSBgY2VsbHNgIHRpbWVzIHRoZSBjdXJyZW50IGNlbGwgcHJpY2UgcGx1cyBgYml0c2AgdGltZXMgdGhlIGN1cnJl' + - 'bnQgYml0IHByaWNlLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgbmVnYXRpdmUgbnVtYmVyIG9mIGBjZWxsc2Agb3IgYGJpdHNgIHRocm93IGFuIGV4Y2VwdGlv' + - 'biB3aXRoIGV4aXQgY29kZSA1OiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAg' + - 'IGxldCBmZWUgPSBnZXRGb3J3YXJkRmVlKDFfMDAwLCAxXzAwMCwgZmFsc2UpOwovLy8gICAgIGxldCBmZWVOb0x1bXAgPSBnZXRTaW1wbGVGb3J3YXJkRmVlKDFfMDAw' + - 'LCAxXzAwMCwgZmFsc2UpOwovLy8gICAgIGxldCBsdW1wUHJpY2UgPSBmZWUgLSBmZWVOb0x1bXA7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBz' + - 'Oi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkdmFuY2VkI2dldHNpbXBsZWZvcndhcmRmZWUKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm' + - 'L2NvcmUtYWR2YW5jZWQjZ2V0Zm9yd2FyZGZlZQovLy8KYXNtIGZ1biBnZXRTaW1wbGVGb3J3YXJkRmVlKGNlbGxzOiBJbnQsIGJpdHM6IEludCwgaXNNYXN0ZXJjaGFp' + - 'bjogQm9vbCk6IEludCB7IEdFVEZPUldBUkRGRUVTSU1QTEUgfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8g' + - 'Q2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgc28tY2FsbGVkIF9vcmlnaW5hbF8gZm9yd2FyZCBmZWUgaW4gbmFub1RvbmNvaW5zIGBJbnRgIGZvciBhbiBvdXRnb2lu' + - 'ZyBtZXNzYWdlIGJhc2VkIG9uIHRoZSBgZndkRmVlYCBvYnRhaW5lZCBmcm9tIHRoZSBpbmNvbWluZyBtZXNzYWdlLiBJZiBib3RoIHRoZSBzb3VyY2UgYW5kIHRoZSBk' + - 'ZXN0aW5hdGlvbiBhZGRyZXNzZXMgYXJlIGluIHRoZSBiYXNlY2hhaW4sIHRoZW4gc3BlY2lmeSBgaXNNYXN0ZXJjaGFpbmAgYXMgYGZhbHNlYC4gT3RoZXJ3aXNlLCBz' + - 'cGVjaWZ5IGB0cnVlYC4KLy8vCi8vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHRoZSBvdXRnb2luZyBtZXNzYWdlIGRlcGVuZHMgaGVhdmlseSBvbiB0aGUg' + - 'c3RydWN0dXJlIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlLCBzbyBtdWNoIHNvIHRoYXQgeW91IGNhbm5vdCBmdWxseSBwcmVkaWN0IHRoZSBmZWUgdXNpbmcgYGdldEZv' + - 'cndhcmRGZWUoKWAgYWxvbmUuIEV2ZW4gaWYgeW91IGNvdWxkLCBjYWxjdWxhdGluZyB0aGUgZXhhY3QgZmVlIHdpdGggbmFub1RvbmNvaW4tbGV2ZWwgcHJlY2lzaW9u' + - 'IGNhbiBiZSB2ZXJ5IGV4cGVuc2l2ZSwgc28gdGhlIGFwcHJveGltYXRlIHZhbHVlIGdpdmVuIGJ5IHRoaXMgZnVuY3Rpb24gaXMgb2Z0ZW4gZ29vZCBlbm91Z2guCi8v' + - 'LwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhIG5lZ2F0aXZlIHZhbHVlIG9mIGBmd2RGZWVgIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA1OiBgSW50' + - 'ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBmd2RGZWU6IEludCA9IGNvbnRl' + - 'eHQoKS5yZWFkRm9yd2FyZEZlZSgpOwovLy8gICAgIGxldCBvcmlnRmVlOiBJbnQgPSBnZXRPcmlnaW5hbEZ3ZEZlZShmZWUsIGZhbHNlKTsKLy8vIH0KLy8vIGBgYAov' + - 'Ly8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0b3JpZ2luYWxmd2RmZWUKLy8vICogaHR0cHM6Ly9k' + - 'b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0Zm9yd2FyZGZlZQovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1hZHZh' + - 'bmNlZCNjb250ZXh0cmVhZGZvcndhcmRmZWUKLy8vCmFzbSBmdW4gZ2V0T3JpZ2luYWxGd2RGZWUoZndkRmVlOiBJbnQsIGlzTWFzdGVyY2hhaW46IEJvb2wpOiBJbnQg' + - 'eyBHRVRPUklHSU5BTEZXREZFRSB9CgovLy8gU3RydWN0IHJlcHJlc2VudGluZyB0aGUgc3RhbmRhcmQgYWRkcmVzcyBvbiBUT04gQmxvY2tjaGFpbiB3aXRoIHNpZ25l' + - 'ZCA4LWJpdCBgd29ya2NoYWluYCBJRCBhbmQgYW4gdW5zaWduZWQgMjU2LWJpdCBgYWRkcmVzc2AgaW4gdGhlIHNwZWNpZmllZCBgd29ya2NoYWluYC4gQXZhaWxhYmxl' + - 'IHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8gQXQgdGhlIG1vbWVudCwgb25seSBgd29ya2NoYWluYCBJRHMgdXNlZCBvbiBUT04gYXJlIDAgb2YgdGhlIGJhc2VjaGFp' + - 'biBhbmQgLTEgb2YgdGhlIG1hc3RlcmNoYWluLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjcGFy' + - 'c2VzdGRhZGRyZXNzCi8vLyAqIGh0dHBzOi8vZ2l0aHViLmNvbS90b24tYmxvY2tjaGFpbi90b24vYmxvYi9tYXN0ZXIvY3J5cHRvL2Jsb2NrL2Jsb2NrLnRsYiNMMTA1' + - 'LUwxMDYKLy8vCnN0cnVjdCBTdGRBZGRyZXNzIHsKICAgIHdvcmtjaGFpbjogSW50IGFzIGludDg7CiAgICBhZGRyZXNzOiBJbnQgYXMgdWludDI1NjsKfQoKLy8vIFN0' + - 'cnVjdCByZXByZXNlbnRpbmcgdGhlIGFkZHJlc3Mgb2YgdmFyaWFibGUgbGVuZ3RoIHdpdGggc2lnbmVkIDMyLWJpdCBgd29ya2NoYWluYCBJRCBhbmQgYSBgU2xpY2Vg' + - 'IGNvbnRhaW5pbmcgdW5zaWduZWQgYGFkZHJlc3NgIGluIHRoZSBzcGVjaWZpZWQgYHdvcmtjaGFpbmAuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgovLy8KLy8v' + - 'IFZhcmlhYmxlLWxlbmd0aCBhZGRyZXNzZXMgYXJlIGludGVuZGVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucywgYW5kIHdoaWxlIHZhbGlkYXRvcnMgbXVzdCBiZSByZWFk' + - 'eSB0byBhY2NlcHQgdGhlbSBpbiBpbmJvdW5kIG1lc3NhZ2VzLCB0aGUgc3RhbmRhcmQgKG5vbi12YXJpYWJsZSkgYWRkcmVzc2VzIGFyZSB1c2VkIHdoZW5ldmVyIHBv' + - 'c3NpYmxlLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjcGFyc2V2YXJhZGRyZXNzCi8vLyAqIGh0' + - 'dHBzOi8vZ2l0aHViLmNvbS90b24tYmxvY2tjaGFpbi90b24vYmxvYi9tYXN0ZXIvY3J5cHRvL2Jsb2NrL2Jsb2NrLnRsYiNMMTA3LUwxMDgKLy8vCnN0cnVjdCBWYXJB' + - 'ZGRyZXNzIHsKICAgIHdvcmtjaGFpbjogSW50IGFzIGludDMyOwogICAgYWRkcmVzczogU2xpY2U7Cn0KCi8vLyBBc3NlbWJseSBmdW5jdGlvbi4gQXZhaWxhYmxlIHNp' + - 'bmNlIFRhY3QgMS41LjAuCi8vLwovLy8gQ29udmVydHMgYSBgU2xpY2VgIGNvbnRhaW5pbmcgYW4gYWRkcmVzcyBpbnRvIHRoZSBgU3RkQWRkcmVzc2AgU3RydWN0IGFu' + - 'ZCByZXR1cm5zIGl0LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBhZGRyID0gYWRkcmVzcygiRVFEdEZwRXdjRkFFY1JlNW1M' + - 'VmgyTjZDMHgtX2hKRU03VzYxX0pMblNGNzRwNHEyIik7Ci8vLyAgICAgbGV0IHBhcnNlZEFkZHIgPSBwYXJzZVN0ZEFkZHJlc3MoYWRkci5hc1NsaWNlKCkpOwovLy8K' + - 'Ly8vICAgICBwYXJzZWRBZGRyLndvcmtjaGFpbjsgLy8gMAovLy8gICAgIHBhcnNlZEFkZHIuYWRkcmVzczsgICAvLyAxMDcuLi4yODcKLy8vIH0KLy8vIGBgYAovLy8K' + - 'Ly8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjcGFyc2VzdGRhZGRyZXNzCi8vLwphc20gZnVuIHBhcnNlU3RkQWRkcmVz' + - 'cyhzbGljZTogU2xpY2UpOiBTdGRBZGRyZXNzIHsgUkVXUklURVNUREFERFIgfQoKLy8vIEFzc2VtYmx5IGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUu' + - 'MC4KLy8vCi8vLyBDb252ZXJ0cyBhIGBTbGljZWAgY29udGFpbmluZyBhbiBhZGRyZXNzIG9mIHZhcmlhYmxlIGxlbmd0aCBpbnRvIHRoZSBgVmFyQWRkcmVzc2AgU3Ry' + - 'dWN0IGFuZCByZXR1cm5zIGl0LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCB2YXJBZGRyU2xpY2UgPSBiZWdpbkNlbGwoKQov' + - 'Ly8gICAgICAgICAuc3RvcmVVaW50KDYsIDMpICAgICAvLyB0byByZWNvZ25pemUgdGhlIGZvbGxvd2luZyBhcyBhIFZhckFkZHJlc3MKLy8vICAgICAgICAgLnN0b3Jl' + - 'VWludCgxMjMsIDkpICAgLy8gbWFrZSBhZGRyZXNzIG9jY3VweSAxMjMgYml0cwovLy8gICAgICAgICAuc3RvcmVVaW50KDIzNCwgMzIpICAvLyBzcGVjaWZ5IHdvcmtj' + - 'aGFpbiBJRCBvZiAyMzQKLy8vICAgICAgICAgLnN0b3JlVWludCgzNDUsIDEyMykgLy8gc3BlY2lmeSBhZGRyZXNzIG9mIDM0NQovLy8gICAgICAgICAuYXNTbGljZSgp' + - 'OwovLy8gICAgIGxldCBwYXJzZWRWYXJBZGRyID0gcGFyc2VWYXJBZGRyZXNzKHZhckFkZHJTbGljZSk7Ci8vLwovLy8gICAgIHBhcnNlZFZhckFkZHIud29ya2NoYWlu' + - 'OyAgICAgICAgICAgICAvLyAyMzQKLy8vICAgICBwYXJzZWRWYXJBZGRyLmFkZHJlc3M7ICAgICAgICAgICAgICAgLy8gQ1N7Q2VsbHswMDIuLi4yYjN9IGJpdHM6IDQ0' + - 'Li4xNjc7IHJlZnM6IDAuLjB9Ci8vLyAgICAgcGFyc2VkVmFyQWRkci5hZGRyZXNzLmxvYWRVaW50KDEyMyk7IC8vIDM0NQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2Vl' + - 'OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1hZHZhbmNlZCNwYXJzZXZhcmFkZHJlc3MKLy8vCmFzbSBmdW4gcGFyc2VWYXJBZGRyZXNzKHNsaWNl' + - 'OiBTbGljZSk6IFZhckFkZHJlc3MgeyBSRVdSSVRFVkFSQUREUiB9Cg=='; -files['std/crypto.tact'] = - 'YXNtIGV4dGVuZHMgZnVuIGhhc2goc2VsZjogQ2VsbCk6IEludCB7IEhBU0hDVSB9Cgphc20gZXh0ZW5kcyBmdW4gaGFzaChzZWxmOiBTbGljZSk6IEludCB7IEhBU0hT' + - 'VSB9Cgphc20gZnVuIGNoZWNrU2lnbmF0dXJlKGhhc2g6IEludCwgc2lnbmF0dXJlOiBTbGljZSwgcHVibGljX2tleTogSW50KTogQm9vbCB7IENIS1NJR05VIH0KCmFz' + - 'bSBmdW4gY2hlY2tEYXRhU2lnbmF0dXJlKGRhdGE6IFNsaWNlLCBzaWduYXR1cmU6IFNsaWNlLCBwdWJsaWNfa2V5OiBJbnQpOiBCb29sIHsgQ0hLU0lHTlMgfQo='; -files['std/debug.tact'] = - 'Ly8gdGhlc2UgYXJlIGJ1aWx0aW4gZnVuY3Rpb25zLCB0aGVzZSBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgZnJvbSBGdW5DCi8vIGhlbmNlLCBubyBhc20gaGVyZQoKQG5h' + - 'bWUodGhyb3cpCm5hdGl2ZSBuYXRpdmVUaHJvdyhjb2RlOiBJbnQpOwoKQG5hbWUodGhyb3dfaWYpCm5hdGl2ZSBuYXRpdmVUaHJvd0lmKGNvZGU6IEludCwgY29uZGl0' + - 'aW9uOiBCb29sKTsKCkBuYW1lKHRocm93KQpuYXRpdmUgdGhyb3coY29kZTogSW50KTsKCkBuYW1lKHRocm93X3VubGVzcykKbmF0aXZlIG5hdGl2ZVRocm93VW5sZXNz' + - 'KGNvZGU6IEludCwgY29uZGl0aW9uOiBCb29sKTs='; -files['std/math.tact'] = - 'Ly8gUHJlcGFyZSByYW5kb20KCi8vIE1peGVzIHVuc2lnbmVkIDI1Ni1iaXQgaW50ZWdlciB4IGludG8gdGhlIHJhbmRvbSBzZWVkIHIgYnkgc2V0dGluZyB0aGUgcmFu' + - 'ZG9tIHNlZWQKLy8gdG8gc2hhMjU2IG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIHR3byAzMi1ieXRlIHN0cmluZ3M6Ci8vIHRoZSBmaXJzdCB3aXRoIHRoZSBiaWctZW5k' + - 'aWFuIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvbGQgc2VlZCByLCBhbmQKLy8gdGhlIHNlY29uZCB3aXRoIHRoZSBiaWctZW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHgu' + - 'CmFzbSBmdW4gbmF0aXZlUmFuZG9taXplKHg6IEludCkgeyBBRERSQU5EIH0KCi8vLyBFcXVpdmFsZW50IHRvIGBuYXRpdmVSYW5kb21pemUoY3VyX2x0KCkpYCwKLy8v' + - 'IHdoZXJlIGBjdXJfbHQoKWAgaXMgdGhlIGxvZ2ljYWwgdGltZSBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgphc20gZnVuIG5hdGl2ZVJhbmRvbWl6ZUx0KCkgeyBM' + - 'VElNRSBBRERSQU5EIH0KCkBuYW1lKF9fdGFjdF9wcmVwYXJlX3JhbmRvbSkKbmF0aXZlIG5hdGl2ZVByZXBhcmVSYW5kb20oKTsKCi8vIFJhbmRvbQoKLy8gR2VuZXJh' + - 'dGVzIGEgbmV3IHBzZXVkby1yYW5kb20gdW5zaWduZWQgMjU2LWJpdCBpbnRlZ2VyIHguCi8vIFRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czogaWYgciBpcyB0aGUg' + - 'b2xkIHZhbHVlIG9mIHRoZSByYW5kb20gc2VlZCwKLy8gY29uc2lkZXJlZCBhcyBhIDMyLWJ5dGUgYXJyYXkgKGJ5IGNvbnN0cnVjdGluZyB0aGUgYmlnLWVuZGlhbiBy' + - 'ZXByZXNlbnRhdGlvbgovLyBvZiBhbiB1bnNpZ25lZCAyNTYtYml0IGludGVnZXIpLCB0aGVuIGl0cyBzaGE1MTIocikgaXMgY29tcHV0ZWQ7Ci8vIHRoZSBmaXJzdCAz' + - 'MiBieXRlcyBvZiB0aGlzIGhhc2ggYXJlIHN0b3JlZCBhcyB0aGUgbmV3IHZhbHVlIHInIG9mIHRoZSByYW5kb20gc2VlZCwKLy8gYW5kIHRoZSByZW1haW5pbmcgMzIg' + - 'Ynl0ZXMgYXJlIHJldHVybmVkIGFzIHRoZSBuZXh0IHJhbmRvbSB2YWx1ZSB4Lgphc20gZnVuIG5hdGl2ZVJhbmRvbSgpOiBJbnQgeyBSQU5EVTI1NiB9CgovLyBHZW5l' + - 'cmF0ZXMgYSBuZXcgcHNldWRvLXJhbmRvbSBpbnRlZ2VyIHogaW4gdGhlIHJhbmdlIDAuLnJhbmdl4oiSMQovLyAob3IgcmFuZ2UuLuKIkjEsIGlmIHJhbmdlIDwgMCku' + - 'Ci8vIE1vcmUgcHJlY2lzZWx5LCBhbiB1bnNpZ25lZCByYW5kb20gdmFsdWUgeCBpcyBnZW5lcmF0ZWQgYXMgaW4gYG5hdGl2ZVJhbmRvbWA7Ci8vIHRoZW4geiA6PSB4' + - 'ICogcmFuZ2UgLyAyXjI1NiBpcyBjb21wdXRlZC4KYXNtIGZ1biBuYXRpdmVSYW5kb21JbnRlcnZhbChtYXg6IEludCk6IEludCB7IFJBTkQgfQoKaW5saW5lIGZ1biBy' + - 'YW5kb21JbnQoKTogSW50IHsKICAgIG5hdGl2ZVByZXBhcmVSYW5kb20oKTsKICAgIHJldHVybiBuYXRpdmVSYW5kb20oKTsKfQoKaW5saW5lIGZ1biByYW5kb20obWlu' + - 'OiBJbnQsIG1heDogSW50KTogSW50IHsKICAgIG5hdGl2ZVByZXBhcmVSYW5kb20oKTsKICAgIHJldHVybiBtaW4gKyBuYXRpdmVSYW5kb21JbnRlcnZhbChtYXggLSBt' + - 'aW4pOwp9CgovLyBNYXRoCgphc20gZnVuIG1pbih4OiBJbnQsIHk6IEludCk6IEludCB7IE1JTiB9Cgphc20gZnVuIG1heCh4OiBJbnQsIHk6IEludCk6IEludCB7IE1B' + - 'WCB9Cgphc20gZnVuIGFicyh4OiBJbnQpOiBJbnQgeyBBQlMgfQoKYXNtIGZ1biBub3coKTogSW50IHsgTk9XIH0KCmFzbSBmdW4gbG9nMihudW06IEludCk6IEludCB7' + - 'CiAgICBEVVAgNSBUSFJPV0lGTk9UIFVCSVRTSVpFIERFQwp9CgpAbmFtZShfX3RhY3RfbG9nKQpuYXRpdmUgbG9nKG51bTogSW50LCBiYXNlOiBJbnQpOiBJbnQ7CgpA' + - 'bmFtZShfX3RhY3RfcG93KQpuYXRpdmUgcG93KGJhc2U6IEludCwgZXhwOiBJbnQpOiBJbnQ7Cgphc20gZnVuIHBvdzIoZXhwOiBJbnQpOiBJbnQgeyBQT1cyIH0='; -files['std/primitives.tact'] = - 'cHJpbWl0aXZlIEludDsKcHJpbWl0aXZlIEJvb2w7CnByaW1pdGl2ZSBCdWlsZGVyOwpwcmltaXRpdmUgU2xpY2U7CnByaW1pdGl2ZSBDZWxsOwpwcmltaXRpdmUgQWRk' + - 'cmVzczsKcHJpbWl0aXZlIFN0cmluZzsKcHJpbWl0aXZlIFN0cmluZ0J1aWxkZXI7'; -files['std/reserve.tact'] = - 'YXNtIGZ1biBuYXRpdmVSZXNlcnZlKGFtb3VudDogSW50LCBtb2RlOiBJbnQpIHsgUkFXUkVTRVJWRSB9Cgpjb25zdCBSZXNlcnZlRXhhY3Q6IEludCA9IDA7CmNvbnN0' + - 'IFJlc2VydmVBbGxFeGNlcHQ6IEludCA9IDE7CmNvbnN0IFJlc2VydmVBdE1vc3Q6IEludCA9IDI7CmNvbnN0IFJlc2VydmVBZGRPcmlnaW5hbEJhbGFuY2U6IEludCA9' + - 'IDQ7CmNvbnN0IFJlc2VydmVJbnZlcnRTaWduOiBJbnQgPSA4Owpjb25zdCBSZXNlcnZlQm91bmNlSWZBY3Rpb25GYWlsOiBJbnQgPSAxNjs='; -files['std/send.tact'] = - 'YXNtIGZ1biBuYXRpdmVTZW5kTWVzc2FnZShjZWxsOiBDZWxsLCBtb2RlOiBJbnQpIHsgU0VORFJBV01TRyB9Cgphc20gZnVuIG5hdGl2ZVNlbmRNZXNzYWdlUmV0dXJu' + - 'Rm9yd2FyZEZlZShtc2c6IENlbGwsIG1vZGU6IEludCk6IEludCB7IFNFTkRNU0cgfQoKY29uc3QgU2VuZFJlbWFpbmluZ0JhbGFuY2U6IEludCA9IDEyODsKY29uc3Qg' + - 'U2VuZFJlbWFpbmluZ1ZhbHVlOiBJbnQgPSA2NDsKY29uc3QgU2VuZERlZmF1bHRNb2RlOiBJbnQgPSAwOwpjb25zdCBTZW5kSWdub3JlRXJyb3JzOiBJbnQgPSAyOwpj' + - 'b25zdCBTZW5kUGF5R2FzU2VwYXJhdGVseTogSW50ID0gMTsKY29uc3QgU2VuZERlc3Ryb3lJZlplcm86IEludCA9IDMyOwpjb25zdCBTZW5kQm91bmNlSWZBY3Rpb25G' + - 'YWlsOiBJbnQgPSAxNjsKY29uc3QgU2VuZE9ubHlFc3RpbWF0ZUZlZTogSW50ID0gMTAyNDsKCnN0cnVjdCBTZW5kUGFyYW1ldGVycyB7CiAgICBib3VuY2U6IEJvb2wg' + - 'PSB0cnVlOwogICAgdG86IEFkZHJlc3M7CiAgICB2YWx1ZTogSW50OwogICAgbW9kZTogSW50ID0gMDsKICAgIGJvZHk6IENlbGw/ID0gbnVsbDsKICAgIGNvZGU6IENl' + - 'bGw/ID0gbnVsbDsKICAgIGRhdGE6IENlbGw/ID0gbnVsbDsKfQoKZnVuIHNlbmQocGFyYW1zOiBTZW5kUGFyYW1ldGVycyk6IEludCB7IC8vIHJldHVybnMgZm9yd2Fy' + - 'ZCBmZWUKICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7CiAgICBiID0gYi5zdG9yZUludCgxLCAyKTsgLy8gaW50ZXJuYWxfbWVzc2FnZSArIGloZF9kaXNh' + - 'YmxlZAogICAgYiA9IGIuc3RvcmVCb29sKHBhcmFtcy5ib3VuY2UpOyAvLyBib3VuY2UKICAgIGIgPSBiLnN0b3JlSW50KDAsIDMpOyAvLyBib3VuY2VkICsgZnJvbQog' + - 'ICAgYiA9IGIuc3RvcmVBZGRyZXNzKHBhcmFtcy50byk7IC8vIFRvCiAgICBiID0gYi5zdG9yZUNvaW5zKHBhcmFtcy52YWx1ZSk7IC8vIFZhbHVlCiAgICBiID0gYi5z' + - 'dG9yZUludCgwLCAxICsgNCArIDQgKyA2NCArIDMyKTsgLy8gY3VycmVuY3lfY29sbGVjdGlvbiArIElIUiBmZWVzICsgRndkIGZlZXMgKyBDcmVhdGVkTFQgKyBDcmVh' + - 'dGVkQXQKCiAgICAvLyBTdGF0ZWluaXQKICAgIGlmIChwYXJhbXMuY29kZSAhPSBudWxsIHx8IHBhcmFtcy5kYXRhICE9IG51bGwpIHsKICAgICAgICBiID0gYi5zdG9y' + - 'ZUJvb2wodHJ1ZSk7IC8vIFN0YXRlIGluaXQKCiAgICAgICAgLy8gQXNzZW1ibGUgc3RhdGUgaW5pdCBjZWxsCiAgICAgICAgbGV0IGJjOiBCdWlsZGVyID0gYmVnaW5D' + - 'ZWxsKCk7CiAgICAgICAgYmMgPSBiYy5zdG9yZUJvb2woZmFsc2UpOyAvLyBTcGxpdERlcHRoCiAgICAgICAgYmMgPSBiYy5zdG9yZUJvb2woZmFsc2UpOyAvLyBUaWNr' + - 'VG9jawogICAgICAgIGlmIChwYXJhbXMuY29kZSAhPSBudWxsKSB7CiAgICAgICAgICAgIGJjID0gYmMuc3RvcmVCb29sKHRydWUpOyAvLyBDb2RlIHByZXNlbmNlCiAg' + - 'ICAgICAgICAgIGJjID0gYmMuc3RvcmVSZWYocGFyYW1zLmNvZGUhISk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmMgPSBiYy5zdG9yZUJvb2woZmFsc2Up' + - 'OyAvLyBDb2RlIHByZXNlbmNlCiAgICAgICAgfQogICAgICAgIGlmIChwYXJhbXMuZGF0YSAhPSBudWxsKSB7CiAgICAgICAgICAgIGJjID0gYmMuc3RvcmVCb29sKHRy' + - 'dWUpOyAvLyBEYXRhIHByZXNlbmNlCiAgICAgICAgICAgIGJjID0gYmMuc3RvcmVSZWYocGFyYW1zLmRhdGEhISk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg' + - 'YmMgPSBiYy5zdG9yZUJvb2woZmFsc2UpOyAvLyBEYXRhIHByZXNlbmNlCiAgICAgICAgfQogICAgICAgIGJjID0gYmMuc3RvcmVCb29sKGZhbHNlKTsgLy8gTGlicmFy' + - 'eQoKICAgICAgICBiID0gYi5zdG9yZUJvb2wodHJ1ZSk7IC8vIFN0b3JlIGFzIHJlZgogICAgICAgIGIgPSBiLnN0b3JlUmVmKGJjLmVuZENlbGwoKSk7CiAgICB9IGVs' + - 'c2UgewogICAgICAgIGIgPSBiLnN0b3JlQm9vbChmYWxzZSk7IC8vIE5vIHN0YXRlIGluaXQKICAgIH0KCiAgICAvLyBCb2R5CiAgICBsZXQgYm9keTogQ2VsbD8gPSBw' + - 'YXJhbXMuYm9keTsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgICBiID0gYi5zdG9yZUJvb2wodHJ1ZSk7CiAgICAgICAgYiA9IGIuc3RvcmVSZWYoYm9keSEh' + - 'KTsKICAgIH0gZWxzZSB7CiAgICAgICAgYiA9IGIuc3RvcmVCb29sKGZhbHNlKTsgLy8gTm8gYm9keQogICAgfQoKICAgIC8vIFNlbmQKICAgIGxldCBjOiBDZWxsID0g' + - 'Yi5lbmRDZWxsKCk7CiAgICByZXR1cm4gbmF0aXZlU2VuZE1lc3NhZ2VSZXR1cm5Gb3J3YXJkRmVlKGMsIHBhcmFtcy5tb2RlKTsKfQoKaW5saW5lIGZ1biBlbWl0KGJv' + - 'ZHk6IENlbGwpIHsKICAgIC8vIGV4dF9vdXRfbXNnX2luZm8kMTEgc3JjOk1zZ0FkZHJlc3NJbnQgZGVzdDpNc2dBZGRyZXNzRXh0IGNyZWF0ZWRfbHQ6dWludDY0IGNy' + - 'ZWF0ZWRfYXQ6dWludDMyCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIG1heWJlOiBzdGF0ZUluaXQgKGZhbHNlKSBib2R5UmVmOiBib29sICh0cnVlKQogICAgbGV0' + - 'IGM6IENlbGwgPSBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVVpbnQoMTUyMTE4MDcyMDI3Mzg3NTI4MTc5NjA0Mzg0NjQ1MTMsIDEwNCkKICAgICAgICAuc3RvcmVS' + - 'ZWYoYm9keSkKICAgICAgICAuZW5kQ2VsbCgpOwogICAgbmF0aXZlU2VuZE1lc3NhZ2UoYywgMCk7Cn0KCmFzbSBmdW4gYWNjZXB0TWVzc2FnZSgpIHsgQUNDRVBUIH0K' + - 'CmFzbSBmdW4gY29tbWl0KCkgeyBDT01NSVQgfQo='; -files['std/text.tact'] = - 'Ly8KLy8gU3RyaW5nIGJ1aWxkZXIKLy8KCkBuYW1lKF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9zdGFydF9zdHJpbmcpCm5hdGl2ZSBiZWdpblN0cmluZygpOiBTdHJpbmdC' + - 'dWlsZGVyOwoKQG5hbWUoX190YWN0X3N0cmluZ19idWlsZGVyX3N0YXJ0X2NvbW1lbnQpCm5hdGl2ZSBiZWdpbkNvbW1lbnQoKTogU3RyaW5nQnVpbGRlcjsKCkBuYW1l' + - 'KF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9zdGFydF90YWlsX3N0cmluZykKbmF0aXZlIGJlZ2luVGFpbFN0cmluZygpOiBTdHJpbmdCdWlsZGVyOwoKQG5hbWUoX190YWN0' + - 'X3N0cmluZ19idWlsZGVyX3N0YXJ0KQpuYXRpdmUgYmVnaW5TdHJpbmdGcm9tQnVpbGRlcihiOiBCdWlsZGVyKTogU3RyaW5nQnVpbGRlcjsKCkBuYW1lKF9fdGFjdF9z' + - 'dHJpbmdfYnVpbGRlcl9hcHBlbmQpCmV4dGVuZHMgbXV0YXRlcyBuYXRpdmUgYXBwZW5kKHNlbGY6IFN0cmluZ0J1aWxkZXIsIHM6IFN0cmluZyk7CgpAbmFtZShfX3Rh' + - 'Y3Rfc3RyaW5nX2J1aWxkZXJfYXBwZW5kX25vdF9tdXQpCmV4dGVuZHMgbmF0aXZlIGNvbmNhdChzZWxmOiBTdHJpbmdCdWlsZGVyLCBzOiBTdHJpbmcpOiBTdHJpbmdC' + - 'dWlsZGVyOwoKQG5hbWUoX190YWN0X3N0cmluZ19idWlsZGVyX2VuZCkKZXh0ZW5kcyBuYXRpdmUgdG9DZWxsKHNlbGY6IFN0cmluZ0J1aWxkZXIpOiBDZWxsOwoKQG5h' + - 'bWUoX190YWN0X3N0cmluZ19idWlsZGVyX2VuZF9zbGljZSkKZXh0ZW5kcyBuYXRpdmUgdG9TdHJpbmcoc2VsZjogU3RyaW5nQnVpbGRlcik6IFN0cmluZzsKCkBuYW1l' + - 'KF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9lbmRfc2xpY2UpCmV4dGVuZHMgbmF0aXZlIHRvU2xpY2Uoc2VsZjogU3RyaW5nQnVpbGRlcik6IFNsaWNlOwoKLy8KLy8gU3Ry' + - 'aW5nIGNvbnZlcnNpb24KLy8KCkBuYW1lKF9fdGFjdF9pbnRfdG9fc3RyaW5nKQpleHRlbmRzIG5hdGl2ZSB0b1N0cmluZyhzZWxmOiBJbnQpOiBTdHJpbmc7CgpAbmFt' + - 'ZShfX3RhY3RfZmxvYXRfdG9fc3RyaW5nKQpleHRlbmRzIG5hdGl2ZSB0b0Zsb2F0U3RyaW5nKHNlbGY6IEludCwgZGlnaXRzOiBJbnQpOiBTdHJpbmc7CgppbmxpbmUg' + - 'ZXh0ZW5kcyBmdW4gdG9Db2luc1N0cmluZyhzZWxmOiBJbnQpOiBTdHJpbmcgewogICAgcmV0dXJuIHNlbGYudG9GbG9hdFN0cmluZyg5KTsKfQoKZXh0ZW5kcyBmdW4g' + - 'YXNDb21tZW50KHNlbGY6IFN0cmluZyk6IENlbGwgewogICAgbGV0IGI6IFN0cmluZ0J1aWxkZXIgPSBiZWdpbkNvbW1lbnQoKTsKICAgIGIuYXBwZW5kKHNlbGYpOwog' + - 'ICAgcmV0dXJuIGIudG9DZWxsKCk7Cn0KCkBuYW1lKF9fdGFjdF9zdHJfdG9fc2xpY2UpCmV4dGVuZHMgbmF0aXZlIGFzU2xpY2Uoc2VsZjogU3RyaW5nKTogU2xpY2U7' + - 'CgpAbmFtZShfX3RhY3Rfc2xpY2VfdG9fc3RyKQpleHRlbmRzIG5hdGl2ZSBhc1N0cmluZyhzZWxmOiBTbGljZSk6IFN0cmluZzsKCmlubGluZSBleHRlbmRzIGZ1biBm' + - 'cm9tQmFzZTY0KHNlbGY6IFN0cmluZyk6IFNsaWNlIHsKICAgIHJldHVybiBzZWxmLmFzU2xpY2UoKS5mcm9tQmFzZTY0KCk7Cn0KCmV4dGVuZHMgZnVuIGZyb21CYXNl' + - 'NjQoc2VsZjogU2xpY2UpOiBTbGljZSB7CiAgICBsZXQgc2l6ZTogSW50ID0gc2VsZi5iaXRzKCkgLyA4OwogICAgbGV0IHJlc3VsdDogQnVpbGRlciA9IGJlZ2luQ2Vs' + - 'bCgpOwoKICAgIHJlcGVhdCAoc2l6ZSkgewogICAgICAgIGxldCBjb2RlOiBJbnQgPSBzZWxmLmxvYWRVaW50KDgpOwogICAgICAgIGlmIChjb2RlID49IDY1ICYmIGNv' + - 'ZGUgPD0gOTApIHsgLy8gQS1aCiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdG9yZVVpbnQoY29kZSAtIDY1LCA2KTsKICAgICAgICB9IGVsc2UgaWYgKGNvZGUg' + - 'Pj0gOTcgJiYgY29kZSA8PSAxMjIpIHsgLy8gYS16CiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdG9yZVVpbnQoY29kZSAtICg5NyAtIDI2KSwgNik7CiAgICAg' + - 'ICAgfSBlbHNlIGlmIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHsgLy8gMC05CiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdG9yZVVpbnQoY29kZSArICg1' + - 'MiAtIDQ4KSwgNik7CiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IDQ1IHx8IGNvZGUgPT0gNDMpIHsgLy8gLSBvciArCiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3Vs' + - 'dC5zdG9yZVVpbnQoNjIsIDYpOwogICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSA5NSB8fCBjb2RlID09IDQ3KSB7IC8vIF8gb3IgLwogICAgICAgICAgICByZXN1bHQg' + - 'PSByZXN1bHQuc3RvcmVVaW50KDYzLCA2KTsKICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gNjEpIHsgLy8gPQogICAgICAgICAgICAvLyBTa2lwCiAgICAgICAgfSBl' + - 'bHNlIHsKICAgICAgICAgICAgdGhyb3coMTM0KTsKICAgICAgICB9CiAgICB9CgogICAgLy8gUGFkZGluZwogICAgbGV0IHRvdGFsOiBJbnQgPSByZXN1bHQuYml0cygp' + - 'OwogICAgbGV0IHBhZGRpbmc6IEludCA9IHRvdGFsICUgODsKICAgIGlmIChwYWRkaW5nICE9IDApIHsKICAgICAgICBsZXQgczogU2xpY2UgPSByZXN1bHQuYXNTbGlj' + - 'ZSgpOwogICAgICAgIHJldHVybiBzLmxvYWRCaXRzKHRvdGFsIC0gcGFkZGluZyk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiByZXN1bHQuYXNTbGljZSgpOwog' + - 'ICAgfQp9CgovLwovLyBBZGRyZXNzIGNvbnZlcnNpb24KLy8KCkBuYW1lKF9fdGFjdF9hZGRyZXNzX3RvX3VzZXJfZnJpZW5kbHkpCmV4dGVuZHMgbmF0aXZlIHRvU3Ry' + - 'aW5nKHNlbGY6IEFkZHJlc3MpOiBTdHJpbmc7'; -files['stdlib_ex.fc'] = - 'Zm9yYWxsIFggLT4gdHVwbGUgX190YWN0X3NldCh0dXBsZSB4LCBYIHYsIGludCBpKSBhc20gIlNFVElOREVYVkFSUSI7CigpIF9fdGFjdF9ub3AoKSBhc20gIk5PUCI7' + - 'CnNsaWNlIF9fdGFjdF9zdHJfdG9fc2xpY2Uoc2xpY2UgcykgYXNtICJOT1AiOwpzbGljZSBfX3RhY3Rfc2xpY2VfdG9fc3RyKHNsaWNlIHMpIGFzbSAiTk9QIjsKc2xp' + - 'Y2UgX190YWN0X2FkZHJlc3NfdG9fc2xpY2Uoc2xpY2UgcykgYXNtICJOT1AiOw=='; -files['stdlib.fc'] = - 'OzsgU3RhbmRhcmQgbGlicmFyeSBmb3IgZnVuQwo7OwoKey0KICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFRPTiBGdW5DIFN0YW5kYXJkIExpYnJhcnkuCgogICAgRnVu' + - 'QyBTdGFuZGFyZCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJt' + - 'cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0' + - 'aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgRnVuQyBTdGFuZGFyZCBMaWJy' + - 'YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl' + - 'biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAg' + - 'R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgotfQoKey0KICAjIFR1cGxlIG1hbmlwdWxhdGlvbiBwcmltaXRpdmVzCiAg' + - 'VGhlIG5hbWVzIGFuZCB0aGUgdHlwZXMgYXJlIG1vc3RseSBzZWxmLWV4cGxhaW5pbmcuCiAgU2VlIFtwb2x5bW9yaGlzbSB3aXRoIGZvcmFsbF0oaHR0cHM6Ly90b24u' + - 'b3JnL2RvY3MvIy9mdW5jL2Z1bmN0aW9ucz9pZD1wb2x5bW9ycGhpc20td2l0aC1mb3JhbGwpCiAgZm9yIG1vcmUgaW5mbyBvbiB0aGUgcG9seW1vcnBoaWMgZnVuY3Rp' + - 'b25zLgoKICBOb3RlIHRoYXQgY3VycmVudGx5IHZhbHVlcyBvZiBhdG9taWMgdHlwZSBgdHVwbGVgIGNhbid0IGJlIGNhc3QgdG8gY29tcG9zaXRlIHR1cGxlIHR5cGUg' + - 'KGUuZy4gYFtpbnQsIGNlbGxdYCkKICBhbmQgdmlzZSB2ZXJzYS4KLX0KCnstCiAgIyBMaXNwLXN0eWxlIGxpc3RzCgogIExpc3RzIGNhbiBiZSByZXByZXNlbnRlZCBh' + - 'cyBuZXN0ZWQgMi1lbGVtZW50cyB0dXBsZXMuCiAgRW1wdHkgbGlzdCBpcyBjb252ZW50aW9uYWxseSByZXByZXNlbnRlZCBhcyBUVk0gYG51bGxgIHZhbHVlIChpdCBj' + - 'YW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyBbbnVsbCgpXSkuCiAgRm9yIGV4YW1wbGUsIHR1cGxlIGAoMSwgKDIsICgzLCBudWxsKSkpYCByZXByZXNlbnRzIGxpc3Qg' + - 'YFsxLCAyLCAzXWAuIEVsZW1lbnRzIG9mIGEgbGlzdCBjYW4gYmUgb2YgZGlmZmVyZW50IHR5cGVzLgotfQoKOzs7IEFkZHMgYW4gZWxlbWVudCB0byB0aGUgYmVnaW5u' + - 'aW5nIG9mIGxpc3Atc3R5bGUgbGlzdC4KZm9yYWxsIFggLT4gdHVwbGUgY29ucyhYIGhlYWQsIHR1cGxlIHRhaWwpIGFzbSAiQ09OUyI7Cgo7OzsgRXh0cmFjdHMgdGhl' + - 'IGhlYWQgYW5kIHRoZSB0YWlsIG9mIGxpc3Atc3R5bGUgbGlzdC4KZm9yYWxsIFggLT4gKFgsIHR1cGxlKSB1bmNvbnModHVwbGUgbGlzdCkgYXNtICJVTkNPTlMiOwoK' + - 'Ozs7IEV4dHJhY3RzIHRoZSB0YWlsIGFuZCB0aGUgaGVhZCBvZiBsaXNwLXN0eWxlIGxpc3QuCmZvcmFsbCBYIC0+ICh0dXBsZSwgWCkgbGlzdF9uZXh0KHR1cGxlIGxp' + - 'c3QpIGFzbSgtPiAxIDApICJVTkNPTlMiOwoKOzs7IFJldHVybnMgdGhlIGhlYWQgb2YgbGlzcC1zdHlsZSBsaXN0Lgpmb3JhbGwgWCAtPiBYIGNhcih0dXBsZSBsaXN0' + - 'KSBhc20gIkNBUiI7Cgo7OzsgUmV0dXJucyB0aGUgdGFpbCBvZiBsaXNwLXN0eWxlIGxpc3QuCnR1cGxlIGNkcih0dXBsZSBsaXN0KSBhc20gIkNEUiI7Cgo7OzsgQ3Jl' + - 'YXRlcyB0dXBsZSB3aXRoIHplcm8gZWxlbWVudHMuCnR1cGxlIGVtcHR5X3R1cGxlKCkgYXNtICJOSUwiOwoKOzs7IEFwcGVuZHMgYSB2YWx1ZSBgeGAgdG8gYSBgVHVw' + - 'bGUgdCA9ICh4MSwgLi4uLCB4bilgLCBidXQgb25seSBpZiB0aGUgcmVzdWx0aW5nIGBUdXBsZSB0JyA9ICh4MSwgLi4uLCB4biwgeClgCjs7OyBpcyBvZiBsZW5ndGgg' + - 'YXQgbW9zdCAyNTUuIE90aGVyd2lzZSB0aHJvd3MgYSB0eXBlIGNoZWNrIGV4Y2VwdGlvbi4KZm9yYWxsIFggLT4gdHVwbGUgdHB1c2godHVwbGUgdCwgWCB2YWx1ZSkg' + - 'YXNtICJUUFVTSCI7CmZvcmFsbCBYIC0+ICh0dXBsZSwgKCkpIH50cHVzaCh0dXBsZSB0LCBYIHZhbHVlKSBhc20gIlRQVVNIIjsKCjs7OyBDcmVhdGVzIGEgdHVwbGUg' + - 'b2YgbGVuZ3RoIG9uZSB3aXRoIGdpdmVuIGFyZ3VtZW50IGFzIGVsZW1lbnQuCmZvcmFsbCBYIC0+IFtYXSBzaW5nbGUoWCB4KSBhc20gIlNJTkdMRSI7Cgo7OzsgVW5w' + - 'YWNrcyBhIHR1cGxlIG9mIGxlbmd0aCBvbmUKZm9yYWxsIFggLT4gWCB1bnNpbmdsZShbWF0gdCkgYXNtICJVTlNJTkdMRSI7Cgo7OzsgQ3JlYXRlcyBhIHR1cGxlIG9m' + - 'IGxlbmd0aCB0d28gd2l0aCBnaXZlbiBhcmd1bWVudHMgYXMgZWxlbWVudHMuCmZvcmFsbCBYLCBZIC0+IFtYLCBZXSBwYWlyKFggeCwgWSB5KSBhc20gIlBBSVIiOwoK' + - 'Ozs7IFVucGFja3MgYSB0dXBsZSBvZiBsZW5ndGggdHdvCmZvcmFsbCBYLCBZIC0+IChYLCBZKSB1bnBhaXIoW1gsIFldIHQpIGFzbSAiVU5QQUlSIjsKCjs7OyBDcmVh' + - 'dGVzIGEgdHVwbGUgb2YgbGVuZ3RoIHRocmVlIHdpdGggZ2l2ZW4gYXJndW1lbnRzIGFzIGVsZW1lbnRzLgpmb3JhbGwgWCwgWSwgWiAtPiBbWCwgWSwgWl0gdHJpcGxl' + - 'KFggeCwgWSB5LCBaIHopIGFzbSAiVFJJUExFIjsKCjs7OyBVbnBhY2tzIGEgdHVwbGUgb2YgbGVuZ3RoIHRocmVlCmZvcmFsbCBYLCBZLCBaIC0+IChYLCBZLCBaKSB1' + - 'bnRyaXBsZShbWCwgWSwgWl0gdCkgYXNtICJVTlRSSVBMRSI7Cgo7OzsgQ3JlYXRlcyBhIHR1cGxlIG9mIGxlbmd0aCBmb3VyIHdpdGggZ2l2ZW4gYXJndW1lbnRzIGFz' + - 'IGVsZW1lbnRzLgpmb3JhbGwgWCwgWSwgWiwgVyAtPiBbWCwgWSwgWiwgV10gdHVwbGU0KFggeCwgWSB5LCBaIHosIFcgdykgYXNtICI0IFRVUExFIjsKCjs7OyBVbnBh' + - 'Y2tzIGEgdHVwbGUgb2YgbGVuZ3RoIGZvdXIKZm9yYWxsIFgsIFksIFosIFcgLT4gKFgsIFksIFosIFcpIHVudHVwbGU0KFtYLCBZLCBaLCBXXSB0KSBhc20gIjQgVU5U' + - 'VVBMRSI7Cgo7OzsgUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHR1cGxlICh3aXRoIHVua25vd24gZWxlbWVudCB0eXBlcykuCmZvcmFsbCBYIC0+IFggZmly' + - 'c3QodHVwbGUgdCkgYXNtICJGSVJTVCI7Cgo7OzsgUmV0dXJucyB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgYSB0dXBsZSAod2l0aCB1bmtub3duIGVsZW1lbnQgdHlwZXMp' + - 'Lgpmb3JhbGwgWCAtPiBYIHNlY29uZCh0dXBsZSB0KSBhc20gIlNFQ09ORCI7Cgo7OzsgUmV0dXJucyB0aGUgdGhpcmQgZWxlbWVudCBvZiBhIHR1cGxlICh3aXRoIHVu' + - 'a25vd24gZWxlbWVudCB0eXBlcykuCmZvcmFsbCBYIC0+IFggdGhpcmQodHVwbGUgdCkgYXNtICJUSElSRCI7Cgo7OzsgUmV0dXJucyB0aGUgZm91cnRoIGVsZW1lbnQg' + - 'b2YgYSB0dXBsZSAod2l0aCB1bmtub3duIGVsZW1lbnQgdHlwZXMpLgpmb3JhbGwgWCAtPiBYIGZvdXJ0aCh0dXBsZSB0KSBhc20gIjMgSU5ERVgiOwoKOzs7IFJldHVy' + - 'bnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBwYWlyIHR1cGxlLgpmb3JhbGwgWCwgWSAtPiBYIHBhaXJfZmlyc3QoW1gsIFldIHApIGFzbSAiRklSU1QiOwoKOzs7IFJl' + - 'dHVybnMgdGhlIHNlY29uZCBlbGVtZW50IG9mIGEgcGFpciB0dXBsZS4KZm9yYWxsIFgsIFkgLT4gWSBwYWlyX3NlY29uZChbWCwgWV0gcCkgYXNtICJTRUNPTkQiOwoK' + - 'Ozs7IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSB0cmlwbGUgdHVwbGUuCmZvcmFsbCBYLCBZLCBaIC0+IFggdHJpcGxlX2ZpcnN0KFtYLCBZLCBaXSBwKSBh' + - 'c20gIkZJUlNUIjsKCjs7OyBSZXR1cm5zIHRoZSBzZWNvbmQgZWxlbWVudCBvZiBhIHRyaXBsZSB0dXBsZS4KZm9yYWxsIFgsIFksIFogLT4gWSB0cmlwbGVfc2Vjb25k' + - 'KFtYLCBZLCBaXSBwKSBhc20gIlNFQ09ORCI7Cgo7OzsgUmV0dXJucyB0aGUgdGhpcmQgZWxlbWVudCBvZiBhIHRyaXBsZSB0dXBsZS4KZm9yYWxsIFgsIFksIFogLT4g' + - 'WiB0cmlwbGVfdGhpcmQoW1gsIFksIFpdIHApIGFzbSAiVEhJUkQiOwoKCjs7OyBQdXNoIG51bGwgZWxlbWVudCAoY2FzdGVkIHRvIGdpdmVuIHR5cGUpCjs7OyBCeSB0' + - 'aGUgVFZNIHR5cGUgYE51bGxgIEZ1bkMgcmVwcmVzZW50cyBhYnNlbmNlIG9mIGEgdmFsdWUgb2Ygc29tZSBhdG9taWMgdHlwZS4KOzs7IFNvIGBudWxsYCBjYW4gYWN0' + - 'dWFsbHkgaGF2ZSBhbnkgYXRvbWljIHR5cGUuCmZvcmFsbCBYIC0+IFggbnVsbCgpIGFzbSAiUFVTSE5VTEwiOwoKOzs7IE1vdmVzIGEgdmFyaWFibGUgW3hdIHRvIHRo' + - 'ZSB0b3Agb2YgdGhlIHN0YWNrCmZvcmFsbCBYIC0+IChYLCAoKSkgfmltcHVyZV90b3VjaChYIHgpIGltcHVyZSBhc20gIk5PUCI7CgoKCjs7OyBSZXR1cm5zIHRoZSBj' + - 'dXJyZW50IFVuaXggdGltZSBhcyBhbiBJbnRlZ2VyCmludCBub3coKSBhc20gIk5PVyI7Cgo7OzsgUmV0dXJucyB0aGUgaW50ZXJuYWwgYWRkcmVzcyBvZiB0aGUgY3Vy' + - 'cmVudCBzbWFydCBjb250cmFjdCBhcyBhIFNsaWNlIHdpdGggYSBgTXNnQWRkcmVzc0ludGAuCjs7OyBJZiBuZWNlc3NhcnksIGl0IGNhbiBiZSBwYXJzZWQgZnVydGhl' + - 'ciB1c2luZyBwcmltaXRpdmVzIHN1Y2ggYXMgW3BhcnNlX3N0ZF9hZGRyXS4Kc2xpY2UgbXlfYWRkcmVzcygpIGFzbSAiTVlBRERSIjsKCjs7OyBSZXR1cm5zIHRoZSBi' + - 'YWxhbmNlIG9mIHRoZSBzbWFydCBjb250cmFjdCBhcyBhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgYW4gaW50Cjs7OyAoYmFsYW5jZSBpbiBuYW5vdG9uY29pbnMpIGFuZCBh' + - 'IGBjZWxsYAo7OzsgKGEgZGljdGlvbmFyeSB3aXRoIDMyLWJpdCBrZXlzIHJlcHJlc2VudGluZyB0aGUgYmFsYW5jZSBvZiAiZXh0cmEgY3VycmVuY2llcyIpCjs7OyBh' + - 'dCB0aGUgc3RhcnQgb2YgQ29tcHV0YXRpb24gUGhhc2UuCjs7OyBOb3RlIHRoYXQgUkFXIHByaW1pdGl2ZXMgc3VjaCBhcyBbc2VuZF9yYXdfbWVzc2FnZV0gZG8gbm90' + - 'IHVwZGF0ZSB0aGlzIGZpZWxkLgpbaW50LCBjZWxsXSBnZXRfYmFsYW5jZSgpIGFzbSAiQkFMQU5DRSI7Cgo7OzsgUmV0dXJucyB0aGUgbG9naWNhbCB0aW1lIG9mIHRo' + - 'ZSBjdXJyZW50IHRyYW5zYWN0aW9uLgppbnQgY3VyX2x0KCkgYXNtICJMVElNRSI7Cgo7OzsgUmV0dXJucyB0aGUgc3RhcnRpbmcgbG9naWNhbCB0aW1lIG9mIHRoZSBj' + - 'dXJyZW50IGJsb2NrLgppbnQgYmxvY2tfbHQoKSBhc20gIkJMT0NLTFQiOwoKOzs7IENvbXB1dGVzIHRoZSByZXByZXNlbnRhdGlvbiBoYXNoIG9mIGEgYGNlbGxgIFtj' + - 'XSBhbmQgcmV0dXJucyBpdCBhcyBhIDI1Ni1iaXQgdW5zaWduZWQgaW50ZWdlciBgeGAuCjs7OyBVc2VmdWwgZm9yIHNpZ25pbmcgYW5kIGNoZWNraW5nIHNpZ25hdHVy' + - 'ZXMgb2YgYXJiaXRyYXJ5IGVudGl0aWVzIHJlcHJlc2VudGVkIGJ5IGEgdHJlZSBvZiBjZWxscy4KaW50IGNlbGxfaGFzaChjZWxsIGMpIGFzbSAiSEFTSENVIjsKCjs7' + - 'OyBDb21wdXRlcyB0aGUgaGFzaCBvZiBhIGBzbGljZSBzYCBhbmQgcmV0dXJucyBpdCBhcyBhIDI1Ni1iaXQgdW5zaWduZWQgaW50ZWdlciBgeGAuCjs7OyBUaGUgcmVz' + - 'dWx0IGlzIHRoZSBzYW1lIGFzIGlmIGFuIG9yZGluYXJ5IGNlbGwgY29udGFpbmluZyBvbmx5IGRhdGEgYW5kIHJlZmVyZW5jZXMgZnJvbSBgc2AgaGFkIGJlZW4gY3Jl' + - 'YXRlZAo7OzsgYW5kIGl0cyBoYXNoIGNvbXB1dGVkIGJ5IFtjZWxsX2hhc2hdLgppbnQgc2xpY2VfaGFzaChzbGljZSBzKSBhc20gIkhBU0hTVSI7Cgo7OzsgQ29tcHV0' + - 'ZXMgc2hhMjU2IG9mIHRoZSBkYXRhIGJpdHMgb2YgYHNsaWNlYCBbc10uIElmIHRoZSBiaXQgbGVuZ3RoIG9mIGBzYCBpcyBub3QgZGl2aXNpYmxlIGJ5IGVpZ2h0LAo7' + - 'OzsgdGhyb3dzIGEgY2VsbCB1bmRlcmZsb3cgZXhjZXB0aW9uLiBUaGUgaGFzaCB2YWx1ZSBpcyByZXR1cm5lZCBhcyBhIDI1Ni1iaXQgdW5zaWduZWQgaW50ZWdlciBg' + - 'eGAuCmludCBzdHJpbmdfaGFzaChzbGljZSBzKSBhc20gIlNIQTI1NlUiOwoKey0KICAjIFNpZ25hdHVyZSBjaGVja3MKLX0KCjs7OyBDaGVja3MgdGhlIEVkMjU1MTkt' + - 'YHNpZ25hdHVyZWAgb2YgYSBgaGFzaGAgKGEgMjU2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLCB1c3VhbGx5IGNvbXB1dGVkIGFzIHRoZSBoYXNoIG9mIHNvbWUgZGF0YSkK' + - 'Ozs7IHVzaW5nIFtwdWJsaWNfa2V5XSAoYWxzbyByZXByZXNlbnRlZCBieSBhIDI1Ni1iaXQgdW5zaWduZWQgaW50ZWdlcikuCjs7OyBUaGUgc2lnbmF0dXJlIG11c3Qg' + - 'Y29udGFpbiBhdCBsZWFzdCA1MTIgZGF0YSBiaXRzOyBvbmx5IHRoZSBmaXJzdCA1MTIgYml0cyBhcmUgdXNlZC4KOzs7IFRoZSByZXN1bHQgaXMgYOKIkjFgIGlmIHRo' + - 'ZSBzaWduYXR1cmUgaXMgdmFsaWQsIGAwYCBvdGhlcndpc2UuCjs7OyBOb3RlIHRoYXQgYENIS1NJR05VYCBjcmVhdGVzIGEgMjU2LWJpdCBzbGljZSB3aXRoIHRoZSBo' + - 'YXNoIGFuZCBjYWxscyBgQ0hLU0lHTlNgLgo7OzsgVGhhdCBpcywgaWYgW2hhc2hdIGlzIGNvbXB1dGVkIGFzIHRoZSBoYXNoIG9mIHNvbWUgZGF0YSwgdGhlc2UgZGF0' + - 'YSBhcmUgaGFzaGVkIHR3aWNlLAo7OzsgdGhlIHNlY29uZCBoYXNoaW5nIG9jY3VycmluZyBpbnNpZGUgYENIS1NJR05TYC4KaW50IGNoZWNrX3NpZ25hdHVyZShpbnQg' + - 'aGFzaCwgc2xpY2Ugc2lnbmF0dXJlLCBpbnQgcHVibGljX2tleSkgYXNtICJDSEtTSUdOVSI7Cgo7OzsgQ2hlY2tzIHdoZXRoZXIgW3NpZ25hdHVyZV0gaXMgYSB2YWxp' + - 'ZCBFZDI1NTE5LXNpZ25hdHVyZSBvZiB0aGUgZGF0YSBwb3J0aW9uIG9mIGBzbGljZSBkYXRhYCB1c2luZyBgcHVibGljX2tleWAsCjs7OyBzaW1pbGFybHkgdG8gW2No' + - 'ZWNrX3NpZ25hdHVyZV0uCjs7OyBJZiB0aGUgYml0IGxlbmd0aCBvZiBbZGF0YV0gaXMgbm90IGRpdmlzaWJsZSBieSBlaWdodCwgdGhyb3dzIGEgY2VsbCB1bmRlcmZs' + - 'b3cgZXhjZXB0aW9uLgo7OzsgVGhlIHZlcmlmaWNhdGlvbiBvZiBFZDI1NTE5IHNpZ25hdHVyZXMgaXMgdGhlIHN0YW5kYXJkIG9uZSwKOzs7IHdpdGggc2hhMjU2IHVz' + - 'ZWQgdG8gcmVkdWNlIFtkYXRhXSB0byB0aGUgMjU2LWJpdCBudW1iZXIgdGhhdCBpcyBhY3R1YWxseSBzaWduZWQuCmludCBjaGVja19kYXRhX3NpZ25hdHVyZShzbGlj' + - 'ZSBkYXRhLCBzbGljZSBzaWduYXR1cmUsIGludCBwdWJsaWNfa2V5KSBhc20gIkNIS1NJR05TIjsKCnstLS0KICAjIENvbXB1dGF0aW9uIG9mIGJvYyBzaXplCiAgVGhl' + - 'IHByaW1pdGl2ZXMgYmVsb3cgbWF5IGJlIHVzZWZ1bCBmb3IgY29tcHV0aW5nIHN0b3JhZ2UgZmVlcyBvZiB1c2VyLXByb3ZpZGVkIGRhdGEuCi19Cgo7OzsgUmV0dXJu' + - 'cyBgKHgsIHksIHosIC0xKWAgb3IgYChudWxsLCBudWxsLCBudWxsLCAwKWAuCjs7OyBSZWN1cnNpdmVseSBjb21wdXRlcyB0aGUgY291bnQgb2YgZGlzdGluY3QgY2Vs' + - 'bHMgYHhgLCBkYXRhIGJpdHMgYHlgLCBhbmQgY2VsbCByZWZlcmVuY2VzIGB6YAo7OzsgaW4gdGhlIERBRyByb290ZWQgYXQgYGNlbGxgIFtjXSwgZWZmZWN0aXZlbHkg' + - 'cmV0dXJuaW5nIHRoZSB0b3RhbCBzdG9yYWdlIHVzZWQgYnkgdGhpcyBEQUcgdGFraW5nIGludG8gYWNjb3VudAo7OzsgdGhlIGlkZW50aWZpY2F0aW9uIG9mIGVxdWFs' + - 'IGNlbGxzLgo7OzsgVGhlIHZhbHVlcyBvZiBgeGAsIGB5YCwgYW5kIGB6YCBhcmUgY29tcHV0ZWQgYnkgYSBkZXB0aC1maXJzdCB0cmF2ZXJzYWwgb2YgdGhpcyBEQUcs' + - 'Cjs7OyB3aXRoIGEgaGFzaCB0YWJsZSBvZiB2aXNpdGVkIGNlbGwgaGFzaGVzIHVzZWQgdG8gcHJldmVudCB2aXNpdHMgb2YgYWxyZWFkeS12aXNpdGVkIGNlbGxzLgo7' + - 'OzsgVGhlIHRvdGFsIGNvdW50IG9mIHZpc2l0ZWQgY2VsbHMgYHhgIGNhbm5vdCBleGNlZWQgbm9uLW5lZ2F0aXZlIFttYXhfY2VsbHNdOwo7Ozsgb3RoZXJ3aXNlIHRo' + - 'ZSBjb21wdXRhdGlvbiBpcyBhYm9ydGVkIGJlZm9yZSB2aXNpdGluZyB0aGUgYChtYXhfY2VsbHMgKyAxKWAtc3QgY2VsbCBhbmQKOzs7IGEgemVybyBmbGFnIGlzIHJl' + - 'dHVybmVkIHRvIGluZGljYXRlIGZhaWx1cmUuIElmIFtjXSBpcyBgbnVsbGAsIHJldHVybnMgYHggPSB5ID0geiA9IDBgLgooaW50LCBpbnQsIGludCkgY29tcHV0ZV9k' + - 'YXRhX3NpemUoY2VsbCBjLCBpbnQgbWF4X2NlbGxzKSBpbXB1cmUgYXNtICJDREFUQVNJWkUiOwoKOzs7IFNpbWlsYXIgdG8gW2NvbXB1dGVfZGF0YV9zaXplP10sIGJ1' + - 'dCBhY2NlcHRpbmcgYSBgc2xpY2VgIFtzXSBpbnN0ZWFkIG9mIGEgYGNlbGxgLgo7OzsgVGhlIHJldHVybmVkIHZhbHVlIG9mIGB4YCBkb2VzIG5vdCB0YWtlIGludG8g' + - 'YWNjb3VudCB0aGUgY2VsbCB0aGF0IGNvbnRhaW5zIHRoZSBgc2xpY2VgIFtzXSBpdHNlbGY7Cjs7OyBob3dldmVyLCB0aGUgZGF0YSBiaXRzIGFuZCB0aGUgY2VsbCBy' + - 'ZWZlcmVuY2VzIG9mIFtzXSBhcmUgYWNjb3VudGVkIGZvciBpbiBgeWAgYW5kIGB6YC4KKGludCwgaW50LCBpbnQpIHNsaWNlX2NvbXB1dGVfZGF0YV9zaXplKHNsaWNl' + - 'IHMsIGludCBtYXhfY2VsbHMpIGltcHVyZSBhc20gIlNEQVRBU0laRSI7Cgo7OzsgQSBub24tcXVpZXQgdmVyc2lvbiBvZiBbY29tcHV0ZV9kYXRhX3NpemU/XSB0aGF0' + - 'IHRocm93cyBhIGNlbGwgb3ZlcmZsb3cgZXhjZXB0aW9uIChgOGApIG9uIGZhaWx1cmUuCihpbnQsIGludCwgaW50LCBpbnQpIGNvbXB1dGVfZGF0YV9zaXplPyhjZWxs' + - 'IGMsIGludCBtYXhfY2VsbHMpIGFzbSAiQ0RBVEFTSVpFUSBOVUxMU1dBUElGTk9UMiBOVUxMU1dBUElGTk9UIjsKCjs7OyBBIG5vbi1xdWlldCB2ZXJzaW9uIG9mIFtz' + - 'bGljZV9jb21wdXRlX2RhdGFfc2l6ZT9dIHRoYXQgdGhyb3dzIGEgY2VsbCBvdmVyZmxvdyBleGNlcHRpb24gKDgpIG9uIGZhaWx1cmUuCihpbnQsIGludCwgaW50LCBp' + - 'bnQpIHNsaWNlX2NvbXB1dGVfZGF0YV9zaXplPyhjZWxsIGMsIGludCBtYXhfY2VsbHMpIGFzbSAiU0RBVEFTSVpFUSBOVUxMU1dBUElGTk9UMiBOVUxMU1dBUElGTk9U' + - 'IjsKCjs7OyBUaHJvd3MgYW4gZXhjZXB0aW9uIHdpdGggZXhpdF9jb2RlIGV4Y25vIGlmIGNvbmQgaXMgbm90IDAgKGNvbW1lbnRlZCBzaW5jZSBpbXBsZW1lbnRlZCBp' + - 'biBjb21waWxhdG9yKQo7OyAoKSB0aHJvd19pZihpbnQgZXhjbm8sIGludCBjb25kKSBpbXB1cmUgYXNtICJUSFJPV0FSR0lGIjsKCnstLQogICMgRGVidWcgcHJpbWl0' + - 'aXZlcwogIE9ubHkgd29ya3MgZm9yIGxvY2FsIFRWTSBleGVjdXRpb24gd2l0aCBkZWJ1ZyBsZXZlbCB2ZXJib3NpdHkKLX0KOzs7IER1bXBzIHRoZSBzdGFjayAoYXQg' + - 'bW9zdCB0aGUgdG9wIDI1NSB2YWx1ZXMpIGFuZCBzaG93cyB0aGUgdG90YWwgc3RhY2sgZGVwdGguCigpIGR1bXBfc3RhY2soKSBpbXB1cmUgYXNtICJEVU1QU1RLIjsK' + - 'CnstCiAgIyBQZXJzaXN0ZW50IHN0b3JhZ2Ugc2F2ZSBhbmQgbG9hZAotfQoKOzs7IFJldHVybnMgdGhlIHBlcnNpc3RlbnQgY29udHJhY3Qgc3RvcmFnZSBjZWxsLiBJ' + - 'dCBjYW4gYmUgcGFyc2VkIG9yIG1vZGlmaWVkIHdpdGggc2xpY2UgYW5kIGJ1aWxkZXIgcHJpbWl0aXZlcyBsYXRlci4KY2VsbCBnZXRfZGF0YSgpIGFzbSAiYzQgUFVT' + - 'SCI7Cgo7OzsgU2V0cyBgY2VsbGAgW2NdIGFzIHBlcnNpc3RlbnQgY29udHJhY3QgZGF0YS4gWW91IGNhbiB1cGRhdGUgcGVyc2lzdGVudCBjb250cmFjdCBzdG9yYWdl' + - 'IHdpdGggdGhpcyBwcmltaXRpdmUuCigpIHNldF9kYXRhKGNlbGwgYykgaW1wdXJlIGFzbSAiYzQgUE9QIjsKCnstCiAgIyBDb250aW51YXRpb24gcHJpbWl0aXZlcwot' + - 'fQo7OzsgVXN1YWxseSBgYzNgIGhhcyBhIGNvbnRpbnVhdGlvbiBpbml0aWFsaXplZCBieSB0aGUgd2hvbGUgY29kZSBvZiB0aGUgY29udHJhY3QuIEl0IGlzIHVzZWQg' + - 'Zm9yIGZ1bmN0aW9uIGNhbGxzLgo7OzsgVGhlIHByaW1pdGl2ZSByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIGBjM2AuCmNvbnQgZ2V0X2MzKCkgaW1wdXJlIGFz' + - 'bSAiYzMgUFVTSCI7Cgo7OzsgVXBkYXRlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiBgYzNgLiBVc3VhbGx5LCBpdCBpcyB1c2VkIGZvciB1cGRhdGluZyBzbWFydCBjb250' + - 'cmFjdCBjb2RlIGluIHJ1bi10aW1lLgo7OzsgTm90ZSB0aGF0IGFmdGVyIGV4ZWN1dGlvbiBvZiB0aGlzIHByaW1pdGl2ZSB0aGUgY3VycmVudCBjb2RlCjs7OyAoYW5k' + - 'IHRoZSBzdGFjayBvZiByZWN1cnNpdmUgZnVuY3Rpb24gY2FsbHMpIHdvbid0IGNoYW5nZSwKOzs7IGJ1dCBhbnkgb3RoZXIgZnVuY3Rpb24gY2FsbCB3aWxsIHVzZSBh' + - 'IGZ1bmN0aW9uIGZyb20gdGhlIG5ldyBjb2RlLgooKSBzZXRfYzMoY29udCBjKSBpbXB1cmUgYXNtICJjMyBQT1AiOwoKOzs7IFRyYW5zZm9ybXMgYSBgc2xpY2VgIFtz' + - 'XSBpbnRvIGEgc2ltcGxlIG9yZGluYXJ5IGNvbnRpbnVhdGlvbiBgY2AsIHdpdGggYGMuY29kZSA9IHNgIGFuZCBhbiBlbXB0eSBzdGFjayBhbmQgc2F2ZWxpc3QuCmNv' + - 'bnQgYmxlc3Moc2xpY2UgcykgaW1wdXJlIGFzbSAiQkxFU1MiOwoKey0tLQogICMgR2FzIHJlbGF0ZWQgcHJpbWl0aXZlcwotfQoKOzs7IFNldHMgY3VycmVudCBnYXMg' + - 'bGltaXQgYGdsYCB0byBpdHMgbWF4aW1hbCBhbGxvd2VkIHZhbHVlIGBnbWAsIGFuZCByZXNldHMgdGhlIGdhcyBjcmVkaXQgYGdjYCB0byB6ZXJvLAo7OzsgZGVjcmVh' + - 'c2luZyB0aGUgdmFsdWUgb2YgYGdyYCBieSBgZ2NgIGluIHRoZSBwcm9jZXNzLgo7OzsgSW4gb3RoZXIgd29yZHMsIHRoZSBjdXJyZW50IHNtYXJ0IGNvbnRyYWN0IGFn' + - 'cmVlcyB0byBidXkgc29tZSBnYXMgdG8gZmluaXNoIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgo7OzsgVGhpcyBhY3Rpb24gaXMgcmVxdWlyZWQgdG8gcHJvY2VzcyBl' + - 'eHRlcm5hbCBtZXNzYWdlcywgd2hpY2ggYnJpbmcgbm8gdmFsdWUgKGhlbmNlIG5vIGdhcykgd2l0aCB0aGVtc2VsdmVzLgo7OzsKOzs7IEZvciBtb3JlIGRldGFpbHMg' + - 'Y2hlY2sgW2FjY2VwdF9tZXNzYWdlIGVmZmVjdHNdKGh0dHBzOi8vdG9uLm9yZy9kb2NzLyMvc21hcnQtY29udHJhY3RzL2FjY2VwdCkuCigpIGFjY2VwdF9tZXNzYWdl' + - 'KCkgaW1wdXJlIGFzbSAiQUNDRVBUIjsKCjs7OyBTZXRzIGN1cnJlbnQgZ2FzIGxpbWl0IGBnbGAgdG8gdGhlIG1pbmltdW0gb2YgbGltaXQgYW5kIGBnbWAsIGFuZCBy' + - 'ZXNldHMgdGhlIGdhcyBjcmVkaXQgYGdjYCB0byB6ZXJvLgo7OzsgSWYgdGhlIGdhcyBjb25zdW1lZCBzbyBmYXIgKGluY2x1ZGluZyB0aGUgcHJlc2VudCBpbnN0cnVj' + - 'dGlvbikgZXhjZWVkcyB0aGUgcmVzdWx0aW5nIHZhbHVlIG9mIGBnbGAsCjs7OyBhbiAodW5oYW5kbGVkKSBvdXQgb2YgZ2FzIGV4Y2VwdGlvbiBpcyB0aHJvd24gYmVm' + - 'b3JlIHNldHRpbmcgbmV3IGdhcyBsaW1pdHMuCjs7OyBOb3RpY2UgdGhhdCBbc2V0X2dhc19saW1pdF0gd2l0aCBhbiBhcmd1bWVudCBgbGltaXQg4omlIDJeNjMg4oiS' + - 'IDFgIGlzIGVxdWl2YWxlbnQgdG8gW2FjY2VwdF9tZXNzYWdlXS4KKCkgc2V0X2dhc19saW1pdChpbnQgbGltaXQpIGltcHVyZSBhc20gIlNFVEdBU0xJTUlUIjsKCjs7' + - 'OyBDb21taXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHJlZ2lzdGVycyBgYzRgICjigJxwZXJzaXN0ZW50IGRhdGHigJ0pIGFuZCBgYzVgICjigJxhY3Rpb25z4oCdKQo7' + - 'Ozsgc28gdGhhdCB0aGUgY3VycmVudCBleGVjdXRpb24gaXMgY29uc2lkZXJlZCDigJxzdWNjZXNzZnVs4oCdIHdpdGggdGhlIHNhdmVkIHZhbHVlcyBldmVuIGlmIGFu' + - 'IGV4Y2VwdGlvbgo7OzsgaW4gQ29tcHV0YXRpb24gUGhhc2UgaXMgdGhyb3duIGxhdGVyLgooKSBjb21taXQoKSBpbXB1cmUgYXNtICJDT01NSVQiOwoKOzs7IE5vdCBp' + - 'bXBsZW1lbnRlZAo7OzsgQ29tcHV0ZXMgdGhlIGFtb3VudCBvZiBnYXMgdGhhdCBjYW4gYmUgYm91Z2h0IGZvciBgYW1vdW50YCBuYW5vVE9OcywKOzs7IGFuZCBzZXRz' + - 'IGBnbGAgYWNjb3JkaW5nbHkgaW4gdGhlIHNhbWUgd2F5IGFzIFtzZXRfZ2FzX2xpbWl0XS4KOzsoKSBidXlfZ2FzKGludCBhbW91bnQpIGltcHVyZSBhc20gIkJVWUdB' + - 'UyI7Cgo7OzsgQ29tcHV0ZXMgdGhlIG1pbmltdW0gb2YgdHdvIGludGVnZXJzIFt4XSBhbmQgW3ldLgppbnQgbWluKGludCB4LCBpbnQgeSkgYXNtICJNSU4iOwoKOzs7' + - 'IENvbXB1dGVzIHRoZSBtYXhpbXVtIG9mIHR3byBpbnRlZ2VycyBbeF0gYW5kIFt5XS4KaW50IG1heChpbnQgeCwgaW50IHkpIGFzbSAiTUFYIjsKCjs7OyBTb3J0cyB0' + - 'd28gaW50ZWdlcnMuCihpbnQsIGludCkgbWlubWF4KGludCB4LCBpbnQgeSkgYXNtICJNSU5NQVgiOwoKOzs7IENvbXB1dGVzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBh' + - 'biBpbnRlZ2VyIFt4XS4KaW50IGFicyhpbnQgeCkgYXNtICJBQlMiOwoKey0KICAjIFNsaWNlIHByaW1pdGl2ZXMKCiAgSXQgaXMgc2FpZCB0aGF0IGEgcHJpbWl0aXZl' + - 'IF9sb2Fkc18gc29tZSBkYXRhLAogIGlmIGl0IHJldHVybnMgdGhlIGRhdGEgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIHNsaWNlCiAgKHNvIGl0IGNhbiBhbHNvIGJl' + - 'IHVzZWQgYXMgW21vZGlmeWluZyBtZXRob2RdKGh0dHBzOi8vdG9uLm9yZy9kb2NzLyMvZnVuYy9zdGF0ZW1lbnRzP2lkPW1vZGlmeWluZy1tZXRob2RzKSkuCgogIEl0' + - 'IGlzIHNhaWQgdGhhdCBhIHByaW1pdGl2ZSBfcHJlbG9hZHNfIHNvbWUgZGF0YSwgaWYgaXQgcmV0dXJucyBvbmx5IHRoZSBkYXRhCiAgKGl0IGNhbiBiZSB1c2VkIGFz' + - 'IFtub24tbW9kaWZ5aW5nIG1ldGhvZF0oaHR0cHM6Ly90b24ub3JnL2RvY3MvIy9mdW5jL3N0YXRlbWVudHM/aWQ9bm9uLW1vZGlmeWluZy1tZXRob2RzKSkuCgogIFVu' + - 'bGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBsb2FkaW5nIGFuZCBwcmVsb2FkaW5nIHByaW1pdGl2ZXMgcmVhZCB0aGUgZGF0YSBmcm9tIGEgcHJlZml4IG9mIHRoZSBzbGlj' + - 'ZS4KLX0KCgo7OzsgQ29udmVydHMgYSBgY2VsbGAgW2NdIGludG8gYSBgc2xpY2VgLiBOb3RpY2UgdGhhdCBbY10gbXVzdCBiZSBlaXRoZXIgYW4gb3JkaW5hcnkgY2Vs' + - 'bCwKOzs7IG9yIGFuIGV4b3RpYyBjZWxsIChzZWUgW1RWTS5wZGZdKGh0dHBzOi8vdG9uLWJsb2NrY2hhaW4uZ2l0aHViLmlvL2RvY3MvdHZtLnBkZiksIDMuMS4yKQo7' + - 'Ozsgd2hpY2ggaXMgYXV0b21hdGljYWxseSBsb2FkZWQgdG8geWllbGQgYW4gb3JkaW5hcnkgY2VsbCBgYydgLCBjb252ZXJ0ZWQgaW50byBhIGBzbGljZWAgYWZ0ZXJ3' + - 'YXJkcy4Kc2xpY2UgYmVnaW5fcGFyc2UoY2VsbCBjKSBhc20gIkNUT1MiOwoKOzs7IENoZWNrcyBpZiBbc10gaXMgZW1wdHkuIElmIG5vdCwgdGhyb3dzIGFuIGV4Y2Vw' + - 'dGlvbi4KKCkgZW5kX3BhcnNlKHNsaWNlIHMpIGltcHVyZSBhc20gIkVORFMiOwoKOzs7IExvYWRzIHRoZSBmaXJzdCByZWZlcmVuY2UgZnJvbSB0aGUgc2xpY2UuCihz' + - 'bGljZSwgY2VsbCkgbG9hZF9yZWYoc2xpY2UgcykgYXNtKC0+IDEgMCkgIkxEUkVGIjsKCjs7OyBQcmVsb2FkcyB0aGUgZmlyc3QgcmVmZXJlbmNlIGZyb20gdGhlIHNs' + - 'aWNlLgpjZWxsIHByZWxvYWRfcmVmKHNsaWNlIHMpIGFzbSAiUExEUkVGIjsKCnstIEZ1bmN0aW9ucyBiZWxvdyBhcmUgY29tbWVudGVkIGJlY2F1c2UgYXJlIGltcGxl' + - 'bWVudGVkIG9uIGNvbXBpbGF0b3IgbGV2ZWwgZm9yIG9wdGltaXNhdGlvbiAtfQoKOzs7IExvYWRzIGEgc2lnbmVkIFtsZW5dLWJpdCBpbnRlZ2VyIGZyb20gYSBzbGlj' + - 'ZSBbc10uCjs7IChzbGljZSwgaW50KSB+bG9hZF9pbnQoc2xpY2UgcywgaW50IGxlbikgYXNtKHMgbGVuIC0+IDEgMCkgIkxESVgiOwoKOzs7IExvYWRzIGFuIHVuc2ln' + - 'bmVkIFtsZW5dLWJpdCBpbnRlZ2VyIGZyb20gYSBzbGljZSBbc10uCjs7IChzbGljZSwgaW50KSB+bG9hZF91aW50KHNsaWNlIHMsIGludCBsZW4pIGFzbSggLT4gMSAw' + - 'KSAiTERVWCI7Cgo7OzsgUHJlbG9hZHMgYSBzaWduZWQgW2xlbl0tYml0IGludGVnZXIgZnJvbSBhIHNsaWNlIFtzXS4KOzsgaW50IHByZWxvYWRfaW50KHNsaWNlIHMs' + - 'IGludCBsZW4pIGFzbSAiUExESVgiOwoKOzs7IFByZWxvYWRzIGFuIHVuc2lnbmVkIFtsZW5dLWJpdCBpbnRlZ2VyIGZyb20gYSBzbGljZSBbc10uCjs7IGludCBwcmVs' + - 'b2FkX3VpbnQoc2xpY2UgcywgaW50IGxlbikgYXNtICJQTERVWCI7Cgo7OzsgTG9hZHMgdGhlIGZpcnN0IGAwIOKJpCBsZW4g4omkIDEwMjNgIGJpdHMgZnJvbSBzbGlj' + - 'ZSBbc10gaW50byBhIHNlcGFyYXRlIGBzbGljZSBzJydgLgo7OyAoc2xpY2UsIHNsaWNlKSBsb2FkX2JpdHMoc2xpY2UgcywgaW50IGxlbikgYXNtKHMgbGVuIC0+IDEg' + - 'MCkgIkxEU0xJQ0VYIjsKCjs7OyBQcmVsb2FkcyB0aGUgZmlyc3QgYDAg4omkIGxlbiDiiaQgMTAyM2AgYml0cyBmcm9tIHNsaWNlIFtzXSBpbnRvIGEgc2VwYXJhdGUg' + - 'YHNsaWNlIHMnJ2AuCjs7IHNsaWNlIHByZWxvYWRfYml0cyhzbGljZSBzLCBpbnQgbGVuKSBhc20gIlBMRFNMSUNFWCI7Cgo7OzsgTG9hZHMgc2VyaWFsaXplZCBhbW91' + - 'bnQgb2YgVG9uQ29pbnMgKGFueSB1bnNpZ25lZCBpbnRlZ2VyIHVwIHRvIGAyXjEyMCAtIDFgKS4KKHNsaWNlLCBpbnQpIGxvYWRfZ3JhbXMoc2xpY2UgcykgYXNtKC0+' + - 'IDEgMCkgIkxER1JBTVMiOwooc2xpY2UsIGludCkgbG9hZF9jb2lucyhzbGljZSBzKSBhc20oLT4gMSAwKSAiTERWQVJVSU5UMTYiOwoKKHNsaWNlLCBpbnQpIGxvYWRf' + - 'dmFyaW50MTYoc2xpY2UgcykgYXNtKC0+IDEgMCkgIkxEVkFSSU5UMTYiOwooc2xpY2UsIGludCkgbG9hZF92YXJpbnQzMihzbGljZSBzKSBhc20oLT4gMSAwKSAiTERW' + - 'QVJJTlQzMiI7CihzbGljZSwgaW50KSBsb2FkX3ZhcnVpbnQxNihzbGljZSBzKSBhc20oLT4gMSAwKSAiTERWQVJVSU5UMTYiOwooc2xpY2UsIGludCkgbG9hZF92YXJ1' + - 'aW50MzIoc2xpY2UgcykgYXNtKC0+IDEgMCkgIkxEVkFSVUlOVDMyIjsKCjs7OyBSZXR1cm5zIGFsbCBidXQgdGhlIGZpcnN0IGAwIOKJpCBsZW4g4omkIDEwMjNgIGJp' + - 'dHMgb2YgYHNsaWNlYCBbc10uCnNsaWNlIHNraXBfYml0cyhzbGljZSBzLCBpbnQgbGVuKSBhc20gIlNEU0tJUEZJUlNUIjsKKHNsaWNlLCAoKSkgfnNraXBfYml0cyhz' + - 'bGljZSBzLCBpbnQgbGVuKSBhc20gIlNEU0tJUEZJUlNUIjsKCjs7OyBSZXR1cm5zIHRoZSBmaXJzdCBgMCDiiaQgbGVuIOKJpCAxMDIzYCBiaXRzIG9mIGBzbGljZWAg' + - 'W3NdLgpzbGljZSBmaXJzdF9iaXRzKHNsaWNlIHMsIGludCBsZW4pIGFzbSAiU0RDVVRGSVJTVCI7Cgo7OzsgUmV0dXJucyBhbGwgYnV0IHRoZSBsYXN0IGAwIOKJpCBs' + - 'ZW4g4omkIDEwMjNgIGJpdHMgb2YgYHNsaWNlYCBbc10uCnNsaWNlIHNraXBfbGFzdF9iaXRzKHNsaWNlIHMsIGludCBsZW4pIGFzbSAiU0RTS0lQTEFTVCI7CihzbGlj' + - 'ZSwgKCkpIH5za2lwX2xhc3RfYml0cyhzbGljZSBzLCBpbnQgbGVuKSBhc20gIlNEU0tJUExBU1QiOwoKOzs7IFJldHVybnMgdGhlIGxhc3QgYDAg4omkIGxlbiDiiaQg' + - 'MTAyM2AgYml0cyBvZiBgc2xpY2VgIFtzXS4Kc2xpY2Ugc2xpY2VfbGFzdChzbGljZSBzLCBpbnQgbGVuKSBhc20gIlNEQ1VUTEFTVCI7Cgo7OzsgTG9hZHMgYSBkaWN0' + - 'aW9uYXJ5IGBEYCAoSGFzaE1hcEUpIGZyb20gYHNsaWNlYCBbc10uCjs7OyAocmV0dXJucyBgbnVsbGAgaWYgYG5vdGhpbmdgIGNvbnN0cnVjdG9yIGlzIHVzZWQpLgoo' + - 'c2xpY2UsIGNlbGwpIGxvYWRfZGljdChzbGljZSBzKSBhc20oLT4gMSAwKSAiTERESUNUIjsKCjs7OyBQcmVsb2FkcyBhIGRpY3Rpb25hcnkgYERgIGZyb20gYHNsaWNl' + - 'YCBbc10uCmNlbGwgcHJlbG9hZF9kaWN0KHNsaWNlIHMpIGFzbSAiUExERElDVCI7Cgo7OzsgTG9hZHMgYSBkaWN0aW9uYXJ5IGFzIFtsb2FkX2RpY3RdLCBidXQgcmV0' + - 'dXJucyBvbmx5IHRoZSByZW1haW5kZXIgb2YgdGhlIHNsaWNlLgpzbGljZSBza2lwX2RpY3Qoc2xpY2UgcykgYXNtICJTS0lQRElDVCI7CihzbGljZSwgKCkpIH5za2lw' + - 'X2RpY3Qoc2xpY2UgcykgYXNtICJTS0lQRElDVCI7Cgo7OzsgTG9hZHMgKE1heWJlIF5DZWxsKSBmcm9tIGBzbGljZWAgW3NdLgo7OzsgSW4gb3RoZXIgd29yZHMgbG9h' + - 'ZHMgMSBiaXQgYW5kIGlmIGl0IGlzIHRydWUKOzs7IGxvYWRzIGZpcnN0IHJlZiBhbmQgcmV0dXJuIGl0IHdpdGggc2xpY2UgcmVtYWluZGVyCjs7OyBvdGhlcndpc2Ug' + - 'cmV0dXJucyBgbnVsbGAgYW5kIHNsaWNlIHJlbWFpbmRlcgooc2xpY2UsIGNlbGwpIGxvYWRfbWF5YmVfcmVmKHNsaWNlIHMpIGFzbSgtPiAxIDApICJMRE9QVFJFRiI7' + - 'Cgo7OzsgUHJlbG9hZHMgKE1heWJlIF5DZWxsKSBmcm9tIGBzbGljZWAgW3NdLgpjZWxsIHByZWxvYWRfbWF5YmVfcmVmKHNsaWNlIHMpIGFzbSAiUExET1BUUkVGIjsK' + - 'Cgo7OzsgUmV0dXJucyB0aGUgZGVwdGggb2YgYGNlbGxgIFtjXS4KOzs7IElmIFtjXSBoYXMgbm8gcmVmZXJlbmNlcywgdGhlbiByZXR1cm4gYDBgOwo7Ozsgb3RoZXJ3' + - 'aXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvbmUgcGx1cyB0aGUgbWF4aW11bSBvZiBkZXB0aHMgb2YgY2VsbHMgcmVmZXJyZWQgdG8gZnJvbSBbY10uCjs7OyBJZiBb' + - 'Y10gaXMgYSBgbnVsbGAgaW5zdGVhZCBvZiBhIGNlbGwsIHJldHVybnMgemVyby4KaW50IGNlbGxfZGVwdGgoY2VsbCBjKSBhc20gIkNERVBUSCI7CgoKey0KICAjIFNs' + - 'aWNlIHNpemUgcHJpbWl0aXZlcwotfQoKOzs7IFJldHVybnMgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzIGluIGBzbGljZWAgW3NdLgppbnQgc2xpY2VfcmVmcyhzbGlj' + - 'ZSBzKSBhc20gIlNSRUZTIjsKCjs7OyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIGluIGBzbGljZWAgW3NdLgppbnQgc2xpY2VfYml0cyhzbGljZSBzKSBh' + - 'c20gIlNCSVRTIjsKCjs7OyBSZXR1cm5zIGJvdGggdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgYW5kIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyBpbiBgc2xpY2VgIFtz' + - 'XS4KKGludCwgaW50KSBzbGljZV9iaXRzX3JlZnMoc2xpY2UgcykgYXNtICJTQklUUkVGUyI7Cgo7OzsgQ2hlY2tzIHdoZXRoZXIgYSBgc2xpY2VgIFtzXSBpcyBlbXB0' + - 'eSAoaS5lLiwgY29udGFpbnMgbm8gYml0cyBvZiBkYXRhIGFuZCBubyBjZWxsIHJlZmVyZW5jZXMpLgppbnQgc2xpY2VfZW1wdHk/KHNsaWNlIHMpIGFzbSAiU0VNUFRZ' + - 'IjsKCjs7OyBDaGVja3Mgd2hldGhlciBgc2xpY2VgIFtzXSBoYXMgbm8gYml0cyBvZiBkYXRhLgppbnQgc2xpY2VfZGF0YV9lbXB0eT8oc2xpY2UgcykgYXNtICJTREVN' + - 'UFRZIjsKCjs7OyBDaGVja3Mgd2hldGhlciBgc2xpY2VgIFtzXSBoYXMgbm8gcmVmZXJlbmNlcy4KaW50IHNsaWNlX3JlZnNfZW1wdHk/KHNsaWNlIHMpIGFzbSAiU1JF' + - 'TVBUWSI7Cgo7OzsgUmV0dXJucyB0aGUgZGVwdGggb2YgYHNsaWNlYCBbc10uCjs7OyBJZiBbc10gaGFzIG5vIHJlZmVyZW5jZXMsIHRoZW4gcmV0dXJucyBgMGA7Cjs7' + - 'OyBvdGhlcndpc2UgdGhlIHJldHVybmVkIHZhbHVlIGlzIG9uZSBwbHVzIHRoZSBtYXhpbXVtIG9mIGRlcHRocyBvZiBjZWxscyByZWZlcnJlZCB0byBmcm9tIFtzXS4K' + - 'aW50IHNsaWNlX2RlcHRoKHNsaWNlIHMpIGFzbSAiU0RFUFRIIjsKCnstCiAgIyBCdWlsZGVyIHNpemUgcHJpbWl0aXZlcwotfQoKOzs7IFJldHVybnMgdGhlIG51bWJl' + - 'ciBvZiBjZWxsIHJlZmVyZW5jZXMgYWxyZWFkeSBzdG9yZWQgaW4gYGJ1aWxkZXJgIFtiXQppbnQgYnVpbGRlcl9yZWZzKGJ1aWxkZXIgYikgYXNtICJCUkVGUyI7Cgo7' + - 'OzsgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyBhbHJlYWR5IHN0b3JlZCBpbiBgYnVpbGRlcmAgW2JdLgppbnQgYnVpbGRlcl9iaXRzKGJ1aWxkZXIgYikg' + - 'YXNtICJCQklUUyI7Cgo7OzsgUmV0dXJucyB0aGUgZGVwdGggb2YgYGJ1aWxkZXJgIFtiXS4KOzs7IElmIG5vIGNlbGwgcmVmZXJlbmNlcyBhcmUgc3RvcmVkIGluIFti' + - 'XSwgdGhlbiByZXR1cm5zIDA7Cjs7OyBvdGhlcndpc2UgdGhlIHJldHVybmVkIHZhbHVlIGlzIG9uZSBwbHVzIHRoZSBtYXhpbXVtIG9mIGRlcHRocyBvZiBjZWxscyBy' + - 'ZWZlcnJlZCB0byBmcm9tIFtiXS4KaW50IGJ1aWxkZXJfZGVwdGgoYnVpbGRlciBiKSBhc20gIkJERVBUSCI7Cgp7LQogICMgQnVpbGRlciBwcmltaXRpdmVzCiAgSXQg' + - 'aXMgc2FpZCB0aGF0IGEgcHJpbWl0aXZlIF9zdG9yZXNfIGEgdmFsdWUgYHhgIGludG8gYSBidWlsZGVyIGBiYAogIGlmIGl0IHJldHVybnMgYSBtb2RpZmllZCB2ZXJz' + - 'aW9uIG9mIHRoZSBidWlsZGVyIGBiJ2Agd2l0aCB0aGUgdmFsdWUgYHhgIHN0b3JlZCBhdCB0aGUgZW5kIG9mIGl0LgogIEl0IGNhbiBiZSB1c2VkIGFzIFtub24tbW9k' + - 'aWZ5aW5nIG1ldGhvZF0oaHR0cHM6Ly90b24ub3JnL2RvY3MvIy9mdW5jL3N0YXRlbWVudHM/aWQ9bm9uLW1vZGlmeWluZy1tZXRob2RzKS4KCiAgQWxsIHRoZSBwcmlt' + - 'aXRpdmVzIGJlbG93IGZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluIHRoZSBgYnVpbGRlcmAsCiAgYW5kIG9ubHkgdGhlbiBjaGVjayB0' + - 'aGUgcmFuZ2Ugb2YgdGhlIHZhbHVlIGJlaW5nIHNlcmlhbGl6ZWQuCi19Cgo7OzsgQ3JlYXRlcyBhIG5ldyBlbXB0eSBgYnVpbGRlcmAuCmJ1aWxkZXIgYmVnaW5fY2Vs' + - 'bCgpIGFzbSAiTkVXQyI7Cgo7OzsgQ29udmVydHMgYSBgYnVpbGRlcmAgaW50byBhbiBvcmRpbmFyeSBgY2VsbGAuCmNlbGwgZW5kX2NlbGwoYnVpbGRlciBiKSBhc20g' + - 'IkVOREMiOwoKOzs7IFN0b3JlcyBhIHJlZmVyZW5jZSB0byBgY2VsbGAgW2NdIGludG8gYGJ1aWxkZXJgIFtiXS4KYnVpbGRlciBzdG9yZV9yZWYoYnVpbGRlciBiLCBj' + - 'ZWxsIGMpIGFzbShjIGIpICJTVFJFRiI7Cgo7OzsgU3RvcmVzIGFuIHVuc2lnbmVkIFtsZW5dLWJpdCBpbnRlZ2VyIGB4YCBpbnRvIGBiYCBmb3IgYDAg4omkIGxlbiDi' + - 'iaQgMjU2YC4KOzsgYnVpbGRlciBzdG9yZV91aW50KGJ1aWxkZXIgYiwgaW50IHgsIGludCBsZW4pIGFzbSh4IGIgbGVuKSAiU1RVWCI7Cgo7OzsgU3RvcmVzIGEgc2ln' + - 'bmVkIFtsZW5dLWJpdCBpbnRlZ2VyIGB4YCBpbnRvIGBiYCBmb3JgIDAg4omkIGxlbiDiiaQgMjU3YC4KOzsgYnVpbGRlciBzdG9yZV9pbnQoYnVpbGRlciBiLCBpbnQg' + - 'eCwgaW50IGxlbikgYXNtKHggYiBsZW4pICJTVElYIjsKCgo7OzsgU3RvcmVzIGBzbGljZWAgW3NdIGludG8gYGJ1aWxkZXJgIFtiXQpidWlsZGVyIHN0b3JlX3NsaWNl' + - 'KGJ1aWxkZXIgYiwgc2xpY2UgcykgYXNtICJTVFNMSUNFUiI7Cgo7OzsgU3RvcmVzIChzZXJpYWxpemVzKSBhbiBpbnRlZ2VyIFt4XSBpbiB0aGUgcmFuZ2UgYDAuLjJe' + - 'MTIwIOKIkiAxYCBpbnRvIGBidWlsZGVyYCBbYl0uCjs7OyBUaGUgc2VyaWFsaXphdGlvbiBvZiBbeF0gY29uc2lzdHMgb2YgYSA0LWJpdCB1bnNpZ25lZCBiaWctZW5k' + - 'aWFuIGludGVnZXIgYGxgLAo7Ozsgd2hpY2ggaXMgdGhlIHNtYWxsZXN0IGludGVnZXIgYGwg4omlIDBgLCBzdWNoIHRoYXQgYHggPCAyXjhsYCwKOzs7IGZvbGxvd2Vk' + - 'IGJ5IGFuIGA4bGAtYml0IHVuc2lnbmVkIGJpZy1lbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgW3hdLgo7OzsgSWYgW3hdIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgc3Vw' + - 'cG9ydGVkIHJhbmdlLCBhIHJhbmdlIGNoZWNrIGV4Y2VwdGlvbiBpcyB0aHJvd24uCjs7Owo7OzsgU3RvcmUgYW1vdW50cyBvZiBUb25Db2lucyB0byB0aGUgYnVpbGRl' + - 'ciBhcyBWYXJVSW50ZWdlciAxNgpidWlsZGVyIHN0b3JlX2dyYW1zKGJ1aWxkZXIgYiwgaW50IHgpIGFzbSAiU1RHUkFNUyI7CmJ1aWxkZXIgc3RvcmVfY29pbnMoYnVp' + - 'bGRlciBiLCBpbnQgeCkgYXNtICJTVFZBUlVJTlQxNiI7CgpidWlsZGVyIHN0b3JlX3ZhcmludDE2KGJ1aWxkZXIgYiwgaW50IHgpIGFzbSAiU1RWQVJJTlQxNiI7CmJ1' + - 'aWxkZXIgc3RvcmVfdmFyaW50MzIoYnVpbGRlciBiLCBpbnQgeCkgYXNtICJTVFZBUklOVDMyIjsKYnVpbGRlciBzdG9yZV92YXJ1aW50MTYoYnVpbGRlciBiLCBpbnQg' + - 'eCkgYXNtICJTVFZBUlVJTlQxNiI7CmJ1aWxkZXIgc3RvcmVfdmFydWludDMyKGJ1aWxkZXIgYiwgaW50IHgpIGFzbSAiU1RWQVJVSU5UMzIiOwoKOzs7IFN0b3JlcyBk' + - 'aWN0aW9uYXJ5IGBEYCByZXByZXNlbnRlZCBieSBgY2VsbGAgW2NdIG9yIGBudWxsYCBpbnRvIGBidWlsZGVyYCBbYl0uCjs7OyBJbiBvdGhlciB3b3Jkcywgc3RvcmVz' + - 'IGEgYDFgLWJpdCBhbmQgYSByZWZlcmVuY2UgdG8gW2NdIGlmIFtjXSBpcyBub3QgYG51bGxgIGFuZCBgMGAtYml0IG90aGVyd2lzZS4KYnVpbGRlciBzdG9yZV9kaWN0' + - 'KGJ1aWxkZXIgYiwgY2VsbCBjKSBhc20oYyBiKSAiU1RESUNUIjsKCjs7OyBTdG9yZXMgKE1heWJlIF5DZWxsKSB0byBidWlsZGVyOgo7OzsgaWYgY2VsbCBpcyBudWxs' + - 'IHN0b3JlIDEgemVybyBiaXQKOzs7IG90aGVyd2lzZSBzdG9yZSAxIHRydWUgYml0IGFuZCByZWYgdG8gY2VsbApidWlsZGVyIHN0b3JlX21heWJlX3JlZihidWlsZGVy' + - 'IGIsIGNlbGwgYykgYXNtKGMgYikgIlNUT1BUUkVGIjsKCgp7LQogICMgQWRkcmVzcyBtYW5pcHVsYXRpb24gcHJpbWl0aXZlcwogIFRoZSBhZGRyZXNzIG1hbmlwdWxh' + - 'dGlvbiBwcmltaXRpdmVzIGxpc3RlZCBiZWxvdyBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBUTC1CIHNj' + - 'aGVtZToKICBgYGBUTC1CCiAgYWRkcl9ub25lJDAwID0gTXNnQWRkcmVzc0V4dDsKICBhZGRyX2V4dGVybiQwMSBsZW46KCMjIDgpIGV4dGVybmFsX2FkZHJlc3M6KGJp' + - 'dHMgbGVuKQogICAgICAgICAgICAgICA9IE1zZ0FkZHJlc3NFeHQ7CiAgYW55Y2FzdF9pbmZvJF8gZGVwdGg6KCM8PSAzMCkgeyBkZXB0aCA+PSAxIH0KICAgIHJld3Jp' + - 'dGVfcGZ4OihiaXRzIGRlcHRoKSA9IEFueWNhc3Q7CiAgYWRkcl9zdGQkMTAgYW55Y2FzdDooTWF5YmUgQW55Y2FzdCkKICAgIHdvcmtjaGFpbl9pZDppbnQ4IGFkZHJl' + - 'c3M6Yml0czI1NiA9IE1zZ0FkZHJlc3NJbnQ7CiAgYWRkcl92YXIkMTEgYW55Y2FzdDooTWF5YmUgQW55Y2FzdCkgYWRkcl9sZW46KCMjIDkpCiAgICB3b3JrY2hhaW5f' + - 'aWQ6aW50MzIgYWRkcmVzczooYml0cyBhZGRyX2xlbikgPSBNc2dBZGRyZXNzSW50OwogIF8gXzpNc2dBZGRyZXNzSW50ID0gTXNnQWRkcmVzczsKICBfIF86TXNnQWRk' + - 'cmVzc0V4dCA9IE1zZ0FkZHJlc3M7CgogIGludF9tc2dfaW5mbyQwIGlocl9kaXNhYmxlZDpCb29sIGJvdW5jZTpCb29sIGJvdW5jZWQ6Qm9vbAogICAgc3JjOk1zZ0Fk' + - 'ZHJlc3MgZGVzdDpNc2dBZGRyZXNzSW50CiAgICB2YWx1ZTpDdXJyZW5jeUNvbGxlY3Rpb24gaWhyX2ZlZTpHcmFtcyBmd2RfZmVlOkdyYW1zCiAgICBjcmVhdGVkX2x0' + - 'OnVpbnQ2NCBjcmVhdGVkX2F0OnVpbnQzMiA9IENvbW1vbk1zZ0luZm9SZWxheGVkOwogIGV4dF9vdXRfbXNnX2luZm8kMTEgc3JjOk1zZ0FkZHJlc3MgZGVzdDpNc2dB' + - 'ZGRyZXNzRXh0CiAgICBjcmVhdGVkX2x0OnVpbnQ2NCBjcmVhdGVkX2F0OnVpbnQzMiA9IENvbW1vbk1zZ0luZm9SZWxheGVkOwogIGBgYAogIEEgZGVzZXJpYWxpemVk' + - 'IGBNc2dBZGRyZXNzYCBpcyByZXByZXNlbnRlZCBieSBhIHR1cGxlIGB0YCBhcyBmb2xsb3dzOgoKICAtIGBhZGRyX25vbmVgIGlzIHJlcHJlc2VudGVkIGJ5IGB0ID0g' + - 'KDApYCwKICAgIGkuZS4sIGEgdHVwbGUgY29udGFpbmluZyBleGFjdGx5IG9uZSBpbnRlZ2VyIGVxdWFsIHRvIHplcm8uCiAgLSBgYWRkcl9leHRlcm5gIGlzIHJlcHJl' + - 'c2VudGVkIGJ5IGB0ID0gKDEsIHMpYCwKICAgIHdoZXJlIHNsaWNlIGBzYCBjb250YWlucyB0aGUgZmllbGQgYGV4dGVybmFsX2FkZHJlc3NgLiBJbiBvdGhlciB3b3Jk' + - 'cywgYAogICAgdGAgaXMgYSBwYWlyIChhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgdHdvIGVudHJpZXMpLCBjb250YWluaW5nIGFuIGludGVnZXIgZXF1YWwgdG8gb25lIGFu' + - 'ZCBzbGljZSBgc2AuCiAgLSBgYWRkcl9zdGRgIGlzIHJlcHJlc2VudGVkIGJ5IGB0ID0gKDIsIHUsIHgsIHMpYCwKICAgIHdoZXJlIGB1YCBpcyBlaXRoZXIgYSBgbnVs' + - 'bGAgKGlmIGBhbnljYXN0YCBpcyBhYnNlbnQpIG9yIGEgc2xpY2UgYHMnYCBjb250YWluaW5nIGByZXdyaXRlX3BmeGAgKGlmIGFueWNhc3QgaXMgcHJlc2VudCkuCiAg' + - 'ICBOZXh0LCBpbnRlZ2VyIGB4YCBpcyB0aGUgYHdvcmtjaGFpbl9pZGAsIGFuZCBzbGljZSBgc2AgY29udGFpbnMgdGhlIGFkZHJlc3MuCiAgLSBgYWRkcl92YXJgIGlz' + - 'IHJlcHJlc2VudGVkIGJ5IGB0ID0gKDMsIHUsIHgsIHMpYCwKICAgIHdoZXJlIGB1YCwgYHhgLCBhbmQgYHNgIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3IgYGFk' + - 'ZHJfc3RkYC4KLX0KCjs7OyBMb2FkcyBmcm9tIHNsaWNlIFtzXSB0aGUgb25seSBwcmVmaXggdGhhdCBpcyBhIHZhbGlkIGBNc2dBZGRyZXNzYCwKOzs7IGFuZCByZXR1' + - 'cm5zIGJvdGggdGhpcyBwcmVmaXggYHMnYCBhbmQgdGhlIHJlbWFpbmRlciBgcycnYCBvZiBbc10gYXMgc2xpY2VzLgooc2xpY2UsIHNsaWNlKSBsb2FkX21zZ19hZGRy' + - 'KHNsaWNlIHMpIGFzbSgtPiAxIDApICJMRE1TR0FERFIiOwoKOzs7IERlY29tcG9zZXMgc2xpY2UgW3NdIGNvbnRhaW5pbmcgYSB2YWxpZCBgTXNnQWRkcmVzc2AgaW50' + - 'byBhIGB0dXBsZSB0YCB3aXRoIHNlcGFyYXRlIGZpZWxkcyBvZiB0aGlzIGBNc2dBZGRyZXNzYC4KOzs7IElmIFtzXSBpcyBub3QgYSB2YWxpZCBgTXNnQWRkcmVzc2As' + - 'IGEgY2VsbCBkZXNlcmlhbGl6YXRpb24gZXhjZXB0aW9uIGlzIHRocm93bi4KdHVwbGUgcGFyc2VfYWRkcihzbGljZSBzKSBhc20gIlBBUlNFTVNHQUREUiI7Cgo7Ozsg' + - 'UGFyc2VzIHNsaWNlIFtzXSBjb250YWluaW5nIGEgdmFsaWQgYE1zZ0FkZHJlc3NJbnRgICh1c3VhbGx5IGEgYG1zZ19hZGRyX3N0ZGApLAo7OzsgYXBwbGllcyByZXdy' + - 'aXRpbmcgZnJvbSB0aGUgYW55Y2FzdCAoaWYgcHJlc2VudCkgdG8gdGhlIHNhbWUtbGVuZ3RoIHByZWZpeCBvZiB0aGUgYWRkcmVzcywKOzs7IGFuZCByZXR1cm5zIGJv' + - 'dGggdGhlIHdvcmtjaGFpbiBhbmQgdGhlIDI1Ni1iaXQgYWRkcmVzcyBhcyBpbnRlZ2Vycy4KOzs7IElmIHRoZSBhZGRyZXNzIGlzIG5vdCAyNTYtYml0LCBvciBpZiBb' + - 'c10gaXMgbm90IGEgdmFsaWQgc2VyaWFsaXphdGlvbiBvZiBgTXNnQWRkcmVzc0ludGAsCjs7OyB0aHJvd3MgYSBjZWxsIGRlc2VyaWFsaXphdGlvbiBleGNlcHRpb24u' + - 'CihpbnQsIGludCkgcGFyc2Vfc3RkX2FkZHIoc2xpY2UgcykgYXNtICJSRVdSSVRFU1REQUREUiI7Cgo7OzsgQSB2YXJpYW50IG9mIFtwYXJzZV9zdGRfYWRkcl0gdGhh' + - 'dCByZXR1cm5zIHRoZSAocmV3cml0dGVuKSBhZGRyZXNzIGFzIGEgc2xpY2UgW3NdLAo7OzsgZXZlbiBpZiBpdCBpcyBub3QgZXhhY3RseSAyNTYgYml0IGxvbmcgKHJl' + - 'cHJlc2VudGVkIGJ5IGEgYG1zZ19hZGRyX3ZhcmApLgooaW50LCBzbGljZSkgcGFyc2VfdmFyX2FkZHIoc2xpY2UgcykgYXNtICJSRVdSSVRFVkFSQUREUiI7Cgp7LQog' + - 'ICMgRGljdGlvbmFyeSBwcmltaXRpdmVzCi19CgoKOzs7IFNldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBba2V5X2xlbl0tYml0IGtleSBzaWduZWQgaW5kZXgg' + - 'aW4gZGljdGlvbmFyeSBbZGljdF0gdG8gW3ZhbHVlXSAoY2VsbCksCjs7OyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIGRpY3Rpb25hcnkuCmNlbGwgaWRpY3Rfc2V0' + - 'X3JlZihjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIGNlbGwgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVNFVFJFRiI7' + - 'CihjZWxsLCAoKSkgfmlkaWN0X3NldF9yZWYoY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBjZWxsIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBr' + - 'ZXlfbGVuKSAiRElDVElTRVRSRUYiOwoKOzs7IFNldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBba2V5X2xlbl0tYml0IGtleSB1bnNpZ25lZCBpbmRleCBpbiBk' + - 'aWN0aW9uYXJ5IFtkaWN0XSB0byBbdmFsdWVdIChjZWxsKSwKOzs7IGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgZGljdGlvbmFyeS4KY2VsbCB1ZGljdF9zZXRfcmVm' + - 'KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgY2VsbCB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVU0VUUkVGIjsKKGNl' + - 'bGwsICgpKSB+dWRpY3Rfc2V0X3JlZihjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIGNlbGwgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9s' + - 'ZW4pICJESUNUVVNFVFJFRiI7CgpjZWxsIGlkaWN0X2dldF9yZWYoY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4KSBhc20oaW5kZXggZGljdCBrZXlfbGVu' + - 'KSAiRElDVElHRVRPUFRSRUYiOwooY2VsbCwgaW50KSBpZGljdF9nZXRfcmVmPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgpIGFzbShpbmRleCBkaWN0' + - 'IGtleV9sZW4pICJESUNUSUdFVFJFRiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgaW50KSB1ZGljdF9nZXRfcmVmPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQg' + - 'aW5kZXgpIGFzbShpbmRleCBkaWN0IGtleV9sZW4pICJESUNUVUdFVFJFRiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgY2VsbCkgaWRpY3Rfc2V0X2dldF9yZWYoY2Vs' + - 'bCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBjZWxsIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVElTRVRHRVRPUFRSRUYiOwoo' + - 'Y2VsbCwgY2VsbCkgdWRpY3Rfc2V0X2dldF9yZWYoY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBjZWxsIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGlj' + - 'dCBrZXlfbGVuKSAiRElDVFVTRVRHRVRPUFRSRUYiOwooY2VsbCwgaW50KSBpZGljdF9kZWxldGU/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCkgYXNt' + - 'KGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RJREVMIjsKKGNlbGwsIGludCkgdWRpY3RfZGVsZXRlPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgpIGFz' + - 'bShpbmRleCBkaWN0IGtleV9sZW4pICJESUNUVURFTCI7CihzbGljZSwgaW50KSBpZGljdF9nZXQ/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCkgYXNt' + - 'KGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RJR0VUIiAiTlVMTFNXQVBJRk5PVCI7CihzbGljZSwgaW50KSB1ZGljdF9nZXQ/KGNlbGwgZGljdCwgaW50IGtleV9sZW4s' + - 'IGludCBpbmRleCkgYXNtKGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVR0VUIiAiTlVMTFNXQVBJRk5PVCI7CihjZWxsLCBzbGljZSwgaW50KSBpZGljdF9kZWxldGVf' + - 'Z2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgpIGFzbShpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSURFTEdFVCIgIk5VTExTV0FQSUZOT1QiOwoo' + - 'Y2VsbCwgc2xpY2UsIGludCkgdWRpY3RfZGVsZXRlX2dldD8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4KSBhc20oaW5kZXggZGljdCBrZXlfbGVuKSAi' + - 'RElDVFVERUxHRVQiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIChzbGljZSwgaW50KSkgfmlkaWN0X2RlbGV0ZV9nZXQ/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGlu' + - 'dCBpbmRleCkgYXNtKGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RJREVMR0VUIiAiTlVMTFNXQVBJRk5PVCI7CihjZWxsLCAoc2xpY2UsIGludCkpIH51ZGljdF9kZWxl' + - 'dGVfZ2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgpIGFzbShpbmRleCBkaWN0IGtleV9sZW4pICJESUNUVURFTEdFVCIgIk5VTExTV0FQSUZOT1Qi' + - 'OwooY2VsbCwgY2VsbCwgaW50KSBpZGljdF9kZWxldGVfZ2V0X3JlZj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4KSBhc20oaW5kZXggZGljdCBrZXlf' + - 'bGVuKSAiRElDVElERUxHRVRSRUYiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIGNlbGwsIGludCkgdWRpY3RfZGVsZXRlX2dldF9yZWY/KGNlbGwgZGljdCwgaW50IGtl' + - 'eV9sZW4sIGludCBpbmRleCkgYXNtKGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVREVMR0VUUkVGIiAiTlVMTFNXQVBJRk5PVCI7CihjZWxsLCAoY2VsbCwgaW50KSkg' + - 'fmlkaWN0X2RlbGV0ZV9nZXRfcmVmPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgpIGFzbShpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSURFTEdFVFJF' + - 'RiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgKGNlbGwsIGludCkpIH51ZGljdF9kZWxldGVfZ2V0X3JlZj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4' + - 'KSBhc20oaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVERUxHRVRSRUYiICJOVUxMU1dBUElGTk9UIjsKY2VsbCB1ZGljdF9zZXQoY2VsbCBkaWN0LCBpbnQga2V5X2xl' + - 'biwgaW50IGluZGV4LCBzbGljZSB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVU0VUIjsKKGNlbGwsICgpKSB+dWRpY3Rfc2V0KGNlbGwg' + - 'ZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUVVNFVCI7CmNlbGwgaWRpY3Rf' + - 'c2V0KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVNFVCI7Cihj' + - 'ZWxsLCAoKSkgfmlkaWN0X3NldChjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIHNsaWNlIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVu' + - 'KSAiRElDVElTRVQiOwpjZWxsIGRpY3Rfc2V0KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIHNsaWNlIGluZGV4LCBzbGljZSB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRp' + - 'Y3Qga2V5X2xlbikgIkRJQ1RTRVQiOwooY2VsbCwgKCkpIH5kaWN0X3NldChjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGljZSBpbmRleCwgc2xpY2UgdmFsdWUpIGFz' + - 'bSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUU0VUIjsKKGNlbGwsIGludCkgdWRpY3RfYWRkPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgs' + - 'IHNsaWNlIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVBREQiOwooY2VsbCwgaW50KSB1ZGljdF9yZXBsYWNlPyhjZWxsIGRpY3QsIGlu' + - 'dCBrZXlfbGVuLCBpbnQgaW5kZXgsIHNsaWNlIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVSRVBMQUNFIjsKKGNlbGwsIGludCkgdWRp' + - 'Y3RfcmVwbGFjZV9yZWY/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgY2VsbCB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJ' + - 'Q1RVUkVQTEFDRVJFRiI7CihjZWxsLCBzbGljZSwgaW50KSB1ZGljdF9yZXBsYWNlZ2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIHNsaWNlIHZh' + - 'bHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVSRVBMQUNFR0VUIiAiTlVMTFNXQVBJRk5PVCI7CihjZWxsLCBjZWxsLCBpbnQpIHVkaWN0X3Jl' + - 'cGxhY2VnZXRfcmVmPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIGNlbGwgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNU' + - 'VVJFUExBQ0VHRVRSRUYiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIChzbGljZSwgaW50KSkgfnVkaWN0X3JlcGxhY2VnZXQ/KGNlbGwgZGljdCwgaW50IGtleV9sZW4s' + - 'IGludCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUVVJFUExBQ0VHRVQiICJOVUxMU1dBUElGTk9UIjsKKGNlbGws' + - 'IChjZWxsLCBpbnQpKSB+dWRpY3RfcmVwbGFjZWdldF9yZWY/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgY2VsbCB2YWx1ZSkgYXNtKHZhbHVlIGlu' + - 'ZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVUkVQTEFDRUdFVFJFRiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgaW50KSBpZGljdF9hZGQ/KGNlbGwgZGljdCwgaW50IGtl' + - 'eV9sZW4sIGludCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSUFERCI7CihjZWxsLCBpbnQpIGlkaWN0X3JlcGxh' + - 'Y2U/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVJFUExBQ0Ui' + - 'OwooY2VsbCwgaW50KSBpZGljdF9yZXBsYWNlX3JlZj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBjZWxsIHZhbHVlKSBhc20odmFsdWUgaW5kZXgg' + - 'ZGljdCBrZXlfbGVuKSAiRElDVElSRVBMQUNFUkVGIjsKKGNlbGwsIHNsaWNlLCBpbnQpIGlkaWN0X3JlcGxhY2VnZXQ/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGlu' + - 'dCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVJFUExBQ0VHRVQiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIGNl' + - 'bGwsIGludCkgaWRpY3RfcmVwbGFjZWdldF9yZWY/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgY2VsbCB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRp' + - 'Y3Qga2V5X2xlbikgIkRJQ1RJUkVQTEFDRUdFVFJFRiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgKHNsaWNlLCBpbnQpKSB+aWRpY3RfcmVwbGFjZWdldD8oY2VsbCBk' + - 'aWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBzbGljZSB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RJUkVQTEFDRUdFVCIgIk5VTExT' + - 'V0FQSUZOT1QiOwooY2VsbCwgKGNlbGwsIGludCkpIH5pZGljdF9yZXBsYWNlZ2V0X3JlZj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBjZWxsIHZh' + - 'bHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVElSRVBMQUNFR0VUUkVGIiAiTlVMTFNXQVBJRk5PVCI7CmNlbGwgdWRpY3Rfc2V0X2J1aWxkZXIo' + - 'Y2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVTRVRCIjsKKGNl' + - 'bGwsICgpKSB+dWRpY3Rfc2V0X2J1aWxkZXIoY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGlj' + - 'dCBrZXlfbGVuKSAiRElDVFVTRVRCIjsKY2VsbCBpZGljdF9zZXRfYnVpbGRlcihjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIGJ1aWxkZXIgdmFsdWUp' + - 'IGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVNFVEIiOwooY2VsbCwgKCkpIH5pZGljdF9zZXRfYnVpbGRlcihjZWxsIGRpY3QsIGludCBrZXlfbGVu' + - 'LCBpbnQgaW5kZXgsIGJ1aWxkZXIgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVNFVEIiOwpjZWxsIGRpY3Rfc2V0X2J1aWxkZXIoY2Vs' + - 'bCBkaWN0LCBpbnQga2V5X2xlbiwgc2xpY2UgaW5kZXgsIGJ1aWxkZXIgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUU0VUQiI7CihjZWxs' + - 'LCAoKSkgfmRpY3Rfc2V0X2J1aWxkZXIoY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgc2xpY2UgaW5kZXgsIGJ1aWxkZXIgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0' + - 'IGtleV9sZW4pICJESUNUU0VUQiI7CihjZWxsLCBpbnQpIGRpY3RfcmVwbGFjZV9idWlsZGVyPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGljZSBpbmRleCwgYnVp' + - 'bGRlciB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RSRVBMQUNFQiI7CihjZWxsLCBidWlsZGVyLCBpbnQpIGRpY3RfcmVwbGFjZWdldF9i' + - 'dWlsZGVyPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGljZSBpbmRleCwgYnVpbGRlciB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RS' + - 'RVBMQUNFR0VUQiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgc2xpY2UsIGludCkgZGljdF9yZXBsYWNlZ2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGljZSBp' + - 'bmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUUkVQTEFDRUdFVCIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgKGJ1aWxk' + - 'ZXIsIGludCkpIH5kaWN0X3JlcGxhY2VnZXRfYnVpbGRlcj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgc2xpY2UgaW5kZXgsIGJ1aWxkZXIgdmFsdWUpIGFzbSh2YWx1' + - 'ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUUkVQTEFDRUdFVEIiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIChzbGljZSwgaW50KSkgfmRpY3RfcmVwbGFjZWdldD8o' + - 'Y2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgc2xpY2UgaW5kZXgsIHNsaWNlIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFJFUExBQ0VHRVQi' + - 'ICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIGludCkgdWRpY3RfYWRkX2J1aWxkZXI/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgYnVpbGRlciB2YWx1' + - 'ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVQUREQiI7CihjZWxsLCBpbnQpIHVkaWN0X3JlcGxhY2VfYnVpbGRlcj8oY2VsbCBkaWN0LCBpbnQg' + - 'a2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVSRVBMQUNFQiI7CihjZWxsLCBidWlsZGVy' + - 'LCBpbnQpIHVkaWN0X3JlcGxhY2VnZXRfYnVpbGRlcj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20odmFsdWUgaW5k' + - 'ZXggZGljdCBrZXlfbGVuKSAiRElDVFVSRVBMQUNFR0VUQiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgKGJ1aWxkZXIsIGludCkpIH51ZGljdF9yZXBsYWNlZ2V0X2J1' + - 'aWxkZXI/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgYnVpbGRlciB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVUkVQ' + - 'TEFDRUdFVEIiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIGludCkgaWRpY3RfYWRkX2J1aWxkZXI/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgYnVp' + - 'bGRlciB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RJQUREQiI7CihjZWxsLCBpbnQpIGlkaWN0X3JlcGxhY2VfYnVpbGRlcj8oY2VsbCBk' + - 'aWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVElSRVBMQUNFQiI7CihjZWxs' + - 'LCBidWlsZGVyLCBpbnQpIGlkaWN0X3JlcGxhY2VnZXRfYnVpbGRlcj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20o' + - 'dmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVElSRVBMQUNFR0VUQiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgKGJ1aWxkZXIsIGludCkpIH5pZGljdF9yZXBs' + - 'YWNlZ2V0X2J1aWxkZXI/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgYnVpbGRlciB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikg' + - 'IkRJQ1RJUkVQTEFDRUdFVEIiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIGludCwgc2xpY2UsIGludCkgdWRpY3RfZGVsZXRlX2dldF9taW4oY2VsbCBkaWN0LCBpbnQg' + - 'a2V5X2xlbikgYXNtKC0+IDAgMiAxIDMpICJESUNUVVJFTU1JTiIgIk5VTExTV0FQSUZOT1QyIjsKKGNlbGwsIChpbnQsIHNsaWNlLCBpbnQpKSB+dWRpY3Q6OmRlbGV0' + - 'ZV9nZXRfbWluKGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSgtPiAwIDIgMSAzKSAiRElDVFVSRU1NSU4iICJOVUxMU1dBUElGTk9UMiI7CihjZWxsLCBpbnQsIHNs' + - 'aWNlLCBpbnQpIGlkaWN0X2RlbGV0ZV9nZXRfbWluKGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSgtPiAwIDIgMSAzKSAiRElDVElSRU1NSU4iICJOVUxMU1dBUElG' + - 'Tk9UMiI7CihjZWxsLCAoaW50LCBzbGljZSwgaW50KSkgfmlkaWN0OjpkZWxldGVfZ2V0X21pbihjZWxsIGRpY3QsIGludCBrZXlfbGVuKSBhc20oLT4gMCAyIDEgMykg' + - 'IkRJQ1RJUkVNTUlOIiAiTlVMTFNXQVBJRk5PVDIiOwooY2VsbCwgc2xpY2UsIHNsaWNlLCBpbnQpIGRpY3RfZGVsZXRlX2dldF9taW4oY2VsbCBkaWN0LCBpbnQga2V5' + - 'X2xlbikgYXNtKC0+IDAgMiAxIDMpICJESUNUUkVNTUlOIiAiTlVMTFNXQVBJRk5PVDIiOwooY2VsbCwgKHNsaWNlLCBzbGljZSwgaW50KSkgfmRpY3Q6OmRlbGV0ZV9n' + - 'ZXRfbWluKGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSgtPiAwIDIgMSAzKSAiRElDVFJFTU1JTiIgIk5VTExTV0FQSUZOT1QyIjsKKGNlbGwsIGludCwgc2xpY2Us' + - 'IGludCkgdWRpY3RfZGVsZXRlX2dldF9tYXgoY2VsbCBkaWN0LCBpbnQga2V5X2xlbikgYXNtKC0+IDAgMiAxIDMpICJESUNUVVJFTU1BWCIgIk5VTExTV0FQSUZOT1Qy' + - 'IjsKKGNlbGwsIChpbnQsIHNsaWNlLCBpbnQpKSB+dWRpY3Q6OmRlbGV0ZV9nZXRfbWF4KGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSgtPiAwIDIgMSAzKSAiRElD' + - 'VFVSRU1NQVgiICJOVUxMU1dBUElGTk9UMiI7CihjZWxsLCBpbnQsIHNsaWNlLCBpbnQpIGlkaWN0X2RlbGV0ZV9nZXRfbWF4KGNlbGwgZGljdCwgaW50IGtleV9sZW4p' + - 'IGFzbSgtPiAwIDIgMSAzKSAiRElDVElSRU1NQVgiICJOVUxMU1dBUElGTk9UMiI7CihjZWxsLCAoaW50LCBzbGljZSwgaW50KSkgfmlkaWN0OjpkZWxldGVfZ2V0X21h' + - 'eChjZWxsIGRpY3QsIGludCBrZXlfbGVuKSBhc20oLT4gMCAyIDEgMykgIkRJQ1RJUkVNTUFYIiAiTlVMTFNXQVBJRk5PVDIiOwooY2VsbCwgc2xpY2UsIHNsaWNlLCBp' + - 'bnQpIGRpY3RfZGVsZXRlX2dldF9tYXgoY2VsbCBkaWN0LCBpbnQga2V5X2xlbikgYXNtKC0+IDAgMiAxIDMpICJESUNUUkVNTUFYIiAiTlVMTFNXQVBJRk5PVDIiOwoo' + - 'Y2VsbCwgKHNsaWNlLCBzbGljZSwgaW50KSkgfmRpY3Q6OmRlbGV0ZV9nZXRfbWF4KGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSgtPiAwIDIgMSAzKSAiRElDVFJF' + - 'TU1BWCIgIk5VTExTV0FQSUZOT1QyIjsKKGludCwgc2xpY2UsIGludCkgdWRpY3RfZ2V0X21pbj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbikgYXNtICgtPiAxIDAgMikg' + - 'IkRJQ1RVTUlOIiAiTlVMTFNXQVBJRk5PVDIiOwooaW50LCBzbGljZSwgaW50KSB1ZGljdF9nZXRfbWF4PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuKSBhc20gKC0+IDEg' + - 'MCAyKSAiRElDVFVNQVgiICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIGNlbGwsIGludCkgdWRpY3RfZ2V0X21pbl9yZWY/KGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFz' + - 'bSAoLT4gMSAwIDIpICJESUNUVU1JTlJFRiIgIk5VTExTV0FQSUZOT1QyIjsKKGludCwgY2VsbCwgaW50KSB1ZGljdF9nZXRfbWF4X3JlZj8oY2VsbCBkaWN0LCBpbnQg' + - 'a2V5X2xlbikgYXNtICgtPiAxIDAgMikgIkRJQ1RVTUFYUkVGIiAiTlVMTFNXQVBJRk5PVDIiOwooaW50LCBzbGljZSwgaW50KSBpZGljdF9nZXRfbWluPyhjZWxsIGRp' + - 'Y3QsIGludCBrZXlfbGVuKSBhc20gKC0+IDEgMCAyKSAiRElDVElNSU4iICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIHNsaWNlLCBpbnQpIGlkaWN0X2dldF9tYXg/KGNl' + - 'bGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSAoLT4gMSAwIDIpICJESUNUSU1BWCIgIk5VTExTV0FQSUZOT1QyIjsKKGludCwgY2VsbCwgaW50KSBpZGljdF9nZXRfbWlu' + - 'X3JlZj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbikgYXNtICgtPiAxIDAgMikgIkRJQ1RJTUlOUkVGIiAiTlVMTFNXQVBJRk5PVDIiOwooaW50LCBjZWxsLCBpbnQpIGlk' + - 'aWN0X2dldF9tYXhfcmVmPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuKSBhc20gKC0+IDEgMCAyKSAiRElDVElNQVhSRUYiICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIHNs' + - 'aWNlLCBpbnQpIHVkaWN0X2dldF9uZXh0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgcGl2b3QpIGFzbShwaXZvdCBkaWN0IGtleV9sZW4gLT4gMSAwIDIpICJE' + - 'SUNUVUdFVE5FWFQiICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIHNsaWNlLCBpbnQpIHVkaWN0X2dldF9uZXh0ZXE/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBw' + - 'aXZvdCkgYXNtKHBpdm90IGRpY3Qga2V5X2xlbiAtPiAxIDAgMikgIkRJQ1RVR0VUTkVYVEVRIiAiTlVMTFNXQVBJRk5PVDIiOwooaW50LCBzbGljZSwgaW50KSB1ZGlj' + - 'dF9nZXRfcHJldj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IHBpdm90KSBhc20ocGl2b3QgZGljdCBrZXlfbGVuIC0+IDEgMCAyKSAiRElDVFVHRVRQUkVWIiAi' + - 'TlVMTFNXQVBJRk5PVDIiOwooaW50LCBzbGljZSwgaW50KSB1ZGljdF9nZXRfcHJldmVxPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgcGl2b3QpIGFzbShwaXZv' + - 'dCBkaWN0IGtleV9sZW4gLT4gMSAwIDIpICJESUNUVUdFVFBSRVZFUSIgIk5VTExTV0FQSUZOT1QyIjsKKGludCwgc2xpY2UsIGludCkgaWRpY3RfZ2V0X25leHQ/KGNl' + - 'bGwgZGljdCwgaW50IGtleV9sZW4sIGludCBwaXZvdCkgYXNtKHBpdm90IGRpY3Qga2V5X2xlbiAtPiAxIDAgMikgIkRJQ1RJR0VUTkVYVCIgIk5VTExTV0FQSUZOT1Qy' + - 'IjsKKGludCwgc2xpY2UsIGludCkgaWRpY3RfZ2V0X25leHRlcT8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IHBpdm90KSBhc20ocGl2b3QgZGljdCBrZXlfbGVu' + - 'IC0+IDEgMCAyKSAiRElDVElHRVRORVhURVEiICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIHNsaWNlLCBpbnQpIGlkaWN0X2dldF9wcmV2PyhjZWxsIGRpY3QsIGludCBr' + - 'ZXlfbGVuLCBpbnQgcGl2b3QpIGFzbShwaXZvdCBkaWN0IGtleV9sZW4gLT4gMSAwIDIpICJESUNUSUdFVFBSRVYiICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIHNsaWNl' + - 'LCBpbnQpIGlkaWN0X2dldF9wcmV2ZXE/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBwaXZvdCkgYXNtKHBpdm90IGRpY3Qga2V5X2xlbiAtPiAxIDAgMikgIkRJ' + - 'Q1RJR0VUUFJFVkVRIiAiTlVMTFNXQVBJRk5PVDIiOwoKOzs7IENyZWF0ZXMgYW4gZW1wdHkgZGljdGlvbmFyeSwgd2hpY2ggaXMgYWN0dWFsbHkgYSBudWxsIHZhbHVl' + - 'LiBFcXVpdmFsZW50IHRvIFBVU0hOVUxMCmNlbGwgbmV3X2RpY3QoKSBhc20gIk5FV0RJQ1QiOwo7OzsgQ2hlY2tzIHdoZXRoZXIgYSBkaWN0aW9uYXJ5IGlzIGVtcHR5' + - 'LiBFcXVpdmFsZW50IHRvIGNlbGxfbnVsbD8uCmludCBkaWN0X2VtcHR5PyhjZWxsIGMpIGFzbSAiRElDVEVNUFRZIjsKCgp7LSBQcmVmaXggZGljdGlvbmFyeSBwcmlt' + - 'aXRpdmVzIC19CihzbGljZSwgc2xpY2UsIHNsaWNlLCBpbnQpIHBmeGRpY3RfZ2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGljZSBrZXkpIGFzbShrZXkgZGlj' + - 'dCBrZXlfbGVuKSAiUEZYRElDVEdFVFEiICJOVUxMU1dBUElGTk9UMiI7CihjZWxsLCBpbnQpIHBmeGRpY3Rfc2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGlj' + - 'ZSBrZXksIHNsaWNlIHZhbHVlKSBhc20odmFsdWUga2V5IGRpY3Qga2V5X2xlbikgIlBGWERJQ1RTRVQiOwooY2VsbCwgaW50KSBwZnhkaWN0X2RlbGV0ZT8oY2VsbCBk' + - 'aWN0LCBpbnQga2V5X2xlbiwgc2xpY2Uga2V5KSBhc20oa2V5IGRpY3Qga2V5X2xlbikgIlBGWERJQ1RERUwiOwoKOzs7IFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBn' + - 'bG9iYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgd2l0aCBpbnRlZ2VyIGluZGV4IGBpYCBhcyBhIGBjZWxsYCBvciBgbnVsbGAgdmFsdWUuCmNlbGwgY29uZmlnX3Bh' + - 'cmFtKGludCB4KSBhc20gIkNPTkZJR09QVFBBUkFNIjsKOzs7IENoZWNrcyB3aGV0aGVyIGMgaXMgYSBudWxsLiBOb3RlLCB0aGF0IEZ1bkMgYWxzbyBoYXMgcG9seW1v' + - 'cnBoaWMgbnVsbD8gYnVpbHQtaW4uCmludCBjZWxsX251bGw/KGNlbGwgYykgYXNtICJJU05VTEwiOwoKOzs7IENyZWF0ZXMgYW4gb3V0cHV0IGFjdGlvbiB3aGljaCB3' + - 'b3VsZCByZXNlcnZlIGV4YWN0bHkgYW1vdW50IG5hbm90b25jb2lucyAoaWYgbW9kZSA9IDApLCBhdCBtb3N0IGFtb3VudCBuYW5vdG9uY29pbnMgKGlmIG1vZGUgPSAy' + - 'KSwgb3IgYWxsIGJ1dCBhbW91bnQgbmFub3RvbmNvaW5zIChpZiBtb2RlID0gMSBvciBtb2RlID0gMyksIGZyb20gdGhlIHJlbWFpbmluZyBiYWxhbmNlIG9mIHRoZSBh' + - 'Y2NvdW50LiBJdCBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gY3JlYXRpbmcgYW4gb3V0Ym91bmQgbWVzc2FnZSBjYXJyeWluZyBhbW91bnQgbmFub3RvbmNvaW5zIChv' + - 'ciBiIOKIkiBhbW91bnQgbmFub3RvbmNvaW5zLCB3aGVyZSBiIGlzIHRoZSByZW1haW5pbmcgYmFsYW5jZSkgdG8gb25lc2VsZiwgc28gdGhhdCB0aGUgc3Vic2VxdWVu' + - 'dCBvdXRwdXQgYWN0aW9ucyB3b3VsZCBub3QgYmUgYWJsZSB0byBzcGVuZCBtb3JlIG1vbmV5IHRoYW4gdGhlIHJlbWFpbmRlci4gQml0ICsyIGluIG1vZGUgbWVhbnMg' + - 'dGhhdCB0aGUgZXh0ZXJuYWwgYWN0aW9uIGRvZXMgbm90IGZhaWwgaWYgdGhlIHNwZWNpZmllZCBhbW91bnQgY2Fubm90IGJlIHJlc2VydmVkOyBpbnN0ZWFkLCBhbGwg' + - 'cmVtYWluaW5nIGJhbGFuY2UgaXMgcmVzZXJ2ZWQuIEJpdCArOCBpbiBtb2RlIG1lYW5zIGBhbW91bnQgPC0gLWFtb3VudGAgYmVmb3JlIHBlcmZvcm1pbmcgYW55IGZ1' + - 'cnRoZXIgYWN0aW9ucy4gQml0ICs0IGluIG1vZGUgbWVhbnMgdGhhdCBhbW91bnQgaXMgaW5jcmVhc2VkIGJ5IHRoZSBvcmlnaW5hbCBiYWxhbmNlIG9mIHRoZSBjdXJy' + - 'ZW50IGFjY291bnQgKGJlZm9yZSB0aGUgY29tcHV0ZSBwaGFzZSksIGluY2x1ZGluZyBhbGwgZXh0cmEgY3VycmVuY2llcywgYmVmb3JlIHBlcmZvcm1pbmcgYW55IG90' + - 'aGVyIGNoZWNrcyBhbmQgYWN0aW9ucy4gQ3VycmVudGx5LCBhbW91bnQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBhbmQgbW9kZSBtdXN0IGJlIGluIHRo' + - 'ZSByYW5nZSAwLi4xNS4KKCkgcmF3X3Jlc2VydmUoaW50IGFtb3VudCwgaW50IG1vZGUpIGltcHVyZSBhc20gIlJBV1JFU0VSVkUiOwo7OzsgU2ltaWxhciB0byByYXdf' + - 'cmVzZXJ2ZSwgYnV0IGFsc28gYWNjZXB0cyBhIGRpY3Rpb25hcnkgZXh0cmFfYW1vdW50IChyZXByZXNlbnRlZCBieSBhIGNlbGwgb3IgbnVsbCkgd2l0aCBleHRyYSBj' + - 'dXJyZW5jaWVzLiBJbiB0aGlzIHdheSBjdXJyZW5jaWVzIG90aGVyIHRoYW4gVG9uQ29pbiBjYW4gYmUgcmVzZXJ2ZWQuCigpIHJhd19yZXNlcnZlX2V4dHJhKGludCBh' + - 'bW91bnQsIGNlbGwgZXh0cmFfYW1vdW50LCBpbnQgbW9kZSkgaW1wdXJlIGFzbSAiUkFXUkVTRVJWRVgiOwo7OzsgU2VuZHMgYSByYXcgbWVzc2FnZSBjb250YWluZWQg' + - 'aW4gbXNnLCB3aGljaCBzaG91bGQgY29udGFpbiBhIGNvcnJlY3RseSBzZXJpYWxpemVkIG9iamVjdCBNZXNzYWdlIFgsIHdpdGggdGhlIG9ubHkgZXhjZXB0aW9uIHRo' + - 'YXQgdGhlIHNvdXJjZSBhZGRyZXNzIGlzIGFsbG93ZWQgdG8gaGF2ZSBkdW1teSB2YWx1ZSBhZGRyX25vbmUgKHRvIGJlIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0' + - 'aCB0aGUgY3VycmVudCBzbWFydCBjb250cmFjdCBhZGRyZXNzKSwgYW5kIGlocl9mZWUsIGZ3ZF9mZWUsIGNyZWF0ZWRfbHQgYW5kIGNyZWF0ZWRfYXQgZmllbGRzIGNh' + - 'biBoYXZlIGFyYml0cmFyeSB2YWx1ZXMgKHRvIGJlIHJld3JpdHRlbiB3aXRoIGNvcnJlY3QgdmFsdWVzIGR1cmluZyB0aGUgYWN0aW9uIHBoYXNlIG9mIHRoZSBjdXJy' + - 'ZW50IHRyYW5zYWN0aW9uKS4gSW50ZWdlciBwYXJhbWV0ZXIgbW9kZSBjb250YWlucyB0aGUgZmxhZ3MuIEN1cnJlbnRseSBtb2RlID0gMCBpcyB1c2VkIGZvciBvcmRp' + - 'bmFyeSBtZXNzYWdlczsgbW9kZSA9IDEyOCBpcyB1c2VkIGZvciBtZXNzYWdlcyB0aGF0IGFyZSB0byBjYXJyeSBhbGwgdGhlIHJlbWFpbmluZyBiYWxhbmNlIG9mIHRo' + - 'ZSBjdXJyZW50IHNtYXJ0IGNvbnRyYWN0IChpbnN0ZWFkIG9mIHRoZSB2YWx1ZSBvcmlnaW5hbGx5IGluZGljYXRlZCBpbiB0aGUgbWVzc2FnZSk7IG1vZGUgPSA2NCBp' + - 'cyB1c2VkIGZvciBtZXNzYWdlcyB0aGF0IGNhcnJ5IGFsbCB0aGUgcmVtYWluaW5nIHZhbHVlIG9mIHRoZSBpbmJvdW5kIG1lc3NhZ2UgaW4gYWRkaXRpb24gdG8gdGhl' + - 'IHZhbHVlIGluaXRpYWxseSBpbmRpY2F0ZWQgaW4gdGhlIG5ldyBtZXNzYWdlIChpZiBiaXQgMCBpcyBub3Qgc2V0LCB0aGUgZ2FzIGZlZXMgYXJlIGRlZHVjdGVkIGZy' + - 'b20gdGhpcyBhbW91bnQpOyBtb2RlJyA9IG1vZGUgKyAxIG1lYW5zIHRoYXQgdGhlIHNlbmRlciB3YW50cyB0byBwYXkgdHJhbnNmZXIgZmVlcyBzZXBhcmF0ZWx5OyBt' + - 'b2RlJyA9IG1vZGUgKyAyIG1lYW5zIHRoYXQgYW55IGVycm9ycyBhcmlzaW5nIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlIGR1cmluZyB0aGUgYWN0aW9uIHBo' + - 'YXNlIHNob3VsZCBiZSBpZ25vcmVkLiBGaW5hbGx5LCBtb2RlJyA9IG1vZGUgKyAzMiBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGFjY291bnQgbXVzdCBiZSBkZXN0cm95' + - 'ZWQgaWYgaXRzIHJlc3VsdGluZyBiYWxhbmNlIGlzIHplcm8uIFRoaXMgZmxhZyBpcyB1c3VhbGx5IGVtcGxveWVkIHRvZ2V0aGVyIHdpdGggKzEyOC4KKCkgc2VuZF9y' + - 'YXdfbWVzc2FnZShjZWxsIG1zZywgaW50IG1vZGUpIGltcHVyZSBhc20gIlNFTkRSQVdNU0ciOwo7OzsgQ3JlYXRlcyBhbiBvdXRwdXQgYWN0aW9uIHRoYXQgd291bGQg' + - 'Y2hhbmdlIHRoaXMgc21hcnQgY29udHJhY3QgY29kZSB0byB0aGF0IGdpdmVuIGJ5IGNlbGwgbmV3X2NvZGUuIE5vdGljZSB0aGF0IHRoaXMgY2hhbmdlIHdpbGwgdGFr' + - 'ZSBlZmZlY3Qgb25seSBhZnRlciB0aGUgc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbiBvZiB0aGUgY3VycmVudCBydW4gb2YgdGhlIHNtYXJ0IGNvbnRyYWN0CigpIHNldF9j' + - 'b2RlKGNlbGwgbmV3X2NvZGUpIGltcHVyZSBhc20gIlNFVENPREUiOwoKOzs7IEdlbmVyYXRlcyBhIG5ldyBwc2V1ZG8tcmFuZG9tIHVuc2lnbmVkIDI1Ni1iaXQgaW50' + - 'ZWdlciB4LiBUaGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6IGlmIHIgaXMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcmFuZG9tIHNlZWQsIGNvbnNpZGVyZWQgYXMgYSAz' + - 'Mi1ieXRlIGFycmF5IChieSBjb25zdHJ1Y3RpbmcgdGhlIGJpZy1lbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgYW4gdW5zaWduZWQgMjU2LWJpdCBpbnRlZ2VyKSwgdGhl' + - 'biBpdHMgc2hhNTEyKHIpIGlzIGNvbXB1dGVkOyB0aGUgZmlyc3QgMzIgYnl0ZXMgb2YgdGhpcyBoYXNoIGFyZSBzdG9yZWQgYXMgdGhlIG5ldyB2YWx1ZSByJyBvZiB0' + - 'aGUgcmFuZG9tIHNlZWQsIGFuZCB0aGUgcmVtYWluaW5nIDMyIGJ5dGVzIGFyZSByZXR1cm5lZCBhcyB0aGUgbmV4dCByYW5kb20gdmFsdWUgeC4KaW50IHJhbmRvbSgp' + - 'IGltcHVyZSBhc20gIlJBTkRVMjU2IjsKOzs7IEdlbmVyYXRlcyBhIG5ldyBwc2V1ZG8tcmFuZG9tIGludGVnZXIgeiBpbiB0aGUgcmFuZ2UgMC4ucmFuZ2XiiJIxIChv' + - 'ciByYW5nZS4u4oiSMSwgaWYgcmFuZ2UgPCAwKS4gTW9yZSBwcmVjaXNlbHksIGFuIHVuc2lnbmVkIHJhbmRvbSB2YWx1ZSB4IGlzIGdlbmVyYXRlZCBhcyBpbiByYW5k' + - 'b207IHRoZW4geiA6PSB4ICogcmFuZ2UgLyAyXjI1NiBpcyBjb21wdXRlZC4KaW50IHJhbmQoaW50IHJhbmdlKSBpbXB1cmUgYXNtICJSQU5EIjsKOzs7IFJldHVybnMg' + - 'dGhlIGN1cnJlbnQgcmFuZG9tIHNlZWQgYXMgYW4gdW5zaWduZWQgMjU2LWJpdCBJbnRlZ2VyLgppbnQgZ2V0X3NlZWQoKSBpbXB1cmUgYXNtICJSQU5EU0VFRCI7Cjs7' + - 'OyBTZXRzIHRoZSByYW5kb20gc2VlZCB0byB1bnNpZ25lZCAyNTYtYml0IHNlZWQuCigpIHNldF9zZWVkKGludCB4KSBpbXB1cmUgYXNtICJTRVRSQU5EIjsKOzs7IE1p' + - 'eGVzIHVuc2lnbmVkIDI1Ni1iaXQgaW50ZWdlciB4IGludG8gdGhlIHJhbmRvbSBzZWVkIHIgYnkgc2V0dGluZyB0aGUgcmFuZG9tIHNlZWQgdG8gc2hhMjU2IG9mIHRo' + - 'ZSBjb25jYXRlbmF0aW9uIG9mIHR3byAzMi1ieXRlIHN0cmluZ3M6IHRoZSBmaXJzdCB3aXRoIHRoZSBiaWctZW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvbGQg' + - 'c2VlZCByLCBhbmQgdGhlIHNlY29uZCB3aXRoIHRoZSBiaWctZW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHguCigpIHJhbmRvbWl6ZShpbnQgeCkgaW1wdXJlIGFzbSAi' + - 'QUREUkFORCI7Cjs7OyBFcXVpdmFsZW50IHRvIHJhbmRvbWl6ZShjdXJfbHQoKSk7LgooKSByYW5kb21pemVfbHQoKSBpbXB1cmUgYXNtICJMVElNRSIgIkFERFJBTkQi' + - 'OwoKOzs7IENoZWNrcyB3aGV0aGVyIHRoZSBkYXRhIHBhcnRzIG9mIHR3byBzbGljZXMgY29pbnNpZGUKaW50IGVxdWFsX3NsaWNlc19iaXRzKHNsaWNlIGEsIHNsaWNl' + - 'IGIpIGFzbSAiU0RFUSI7Cjs7OyBDaGVja3Mgd2hldGhlciBiIGlzIGEgbnVsbC4gTm90ZSwgdGhhdCBGdW5DIGFsc28gaGFzIHBvbHltb3JwaGljIG51bGw/IGJ1aWx0' + - 'LWluLgppbnQgYnVpbGRlcl9udWxsPyhidWlsZGVyIGIpIGFzbSAiSVNOVUxMIjsKOzs7IENvbmNhdGVuYXRlcyB0d28gYnVpbGRlcnMKYnVpbGRlciBzdG9yZV9idWls' + - 'ZGVyKGJ1aWxkZXIgdG8sIGJ1aWxkZXIgZnJvbSkgYXNtICJTVEJSIjsKCjs7IENVU1RPTToKCjs7IFRWTSBVUEdSQURFIDIwMjMtMDcgaHR0cHM6Ly9kb2NzLnRvbi5v' + - 'cmcvbGVhcm4vdHZtLWluc3RydWN0aW9ucy90dm0tdXBncmFkZS0yMDIzLTA3Cjs7IEluIG1haW5uZXQgc2luY2UgMjAgRGVjIDIwMjMgaHR0cHM6Ly90Lm1lL3RvbmJs' + - 'b2NrY2hhaW4vMjI2Cgo7OzsgUmV0cmlldmVzIGNvZGUgb2Ygc21hcnQtY29udHJhY3QgZnJvbSBjNwpjZWxsIG15X2NvZGUoKSBhc20gIk1ZQ09ERSI7Cg=='; -files['stdlib.tact'] = - 'aW1wb3J0ICIuL3N0ZC9wcmltaXRpdmVzIjsKaW1wb3J0ICIuL3N0ZC9jZWxscyI7CmltcG9ydCAiLi9zdGQvY3J5cHRvIjsKaW1wb3J0ICIuL3N0ZC90ZXh0IjsKaW1w' + - 'b3J0ICIuL3N0ZC9tYXRoIjsKaW1wb3J0ICIuL3N0ZC9jb250cmFjdCI7CmltcG9ydCAiLi9zdGQvZGVidWciOwppbXBvcnQgIi4vc3RkL2NvbnRleHQiOwppbXBvcnQg' + - 'Ii4vc3RkL3Jlc2VydmUiOwppbXBvcnQgIi4vc3RkL3NlbmQiOwppbXBvcnQgIi4vc3RkL2NvbmZpZyI7CmltcG9ydCAiLi9zdGQvYmFzZSI7'; -export default files; \ No newline at end of file +files["libs/config.tact"] = + "ZnVuIGdldENvbmZpZ0FkZHJlc3MoKTogQWRkcmVzcyB7CiAgICBsZXQgY2VsbDogQ2VsbCA9IGdldENvbmZpZ1BhcmFtKDApISE7CiAgICBsZXQgc2M6IFNsaWNlID0g" + + "Y2VsbC5iZWdpblBhcnNlKCk7CiAgICByZXR1cm4gbmV3QWRkcmVzcygtMSwgc2MubG9hZFVpbnQoMjU2KSk7Cn0KCmZ1biBnZXRFbGVjdG9yQWRkcmVzcygpOiBBZGRy" + + "ZXNzIHsKICAgIGxldCBjZWxsOiBDZWxsID0gZ2V0Q29uZmlnUGFyYW0oMSkhITsKICAgIGxldCBzYzogU2xpY2UgPSBjZWxsLmJlZ2luUGFyc2UoKTsKICAgIHJldHVy" + + "biBuZXdBZGRyZXNzKC0xLCBzYy5sb2FkVWludCgyNTYpKTsKfQ=="; +files["libs/content.tact"] = + "ZnVuIGNyZWF0ZU9mZmNoYWluQ29udGVudChsaW5rOiBTdHJpbmcpOiBDZWxsIHsKICAgIGxldCBidWlsZGVyOiBTdHJpbmdCdWlsZGVyID0gYmVnaW5TdHJpbmdGcm9t" + + "QnVpbGRlcihiZWdpbkNlbGwoKS5zdG9yZVVpbnQoMHgwMSwgOCkpOwogICAgYnVpbGRlci5hcHBlbmQobGluayk7CiAgICByZXR1cm4gYnVpbGRlci50b0NlbGwoKTsK" + + "fQ=="; +files["libs/deploy.tact"] = + "Cm1lc3NhZ2UgRGVwbG95IHsKICAgIHF1ZXJ5SWQ6IEludCBhcyB1aW50NjQ7Cn0KCm1lc3NhZ2UgRGVwbG95T2sgewogICAgcXVlcnlJZDogSW50IGFzIHVpbnQ2NDsK" + + "fQoKdHJhaXQgRGVwbG95YWJsZSB7CiAgICByZWNlaXZlKGRlcGxveTogRGVwbG95KSB7CiAgICAgICAgc2VsZi5ub3RpZnkoRGVwbG95T2t7cXVlcnlJZDogZGVwbG95" + + "LnF1ZXJ5SWR9LnRvQ2VsbCgpKTsKICAgIH0KfQoKbWVzc2FnZSBGYWN0b3J5RGVwbG95IHsKICAgIHF1ZXJ5SWQ6IEludCBhcyB1aW50NjQ7CiAgICBjYXNoYmFjazog" + + "QWRkcmVzczsKfQoKdHJhaXQgRmFjdG9yeURlcGxveWFibGUgIHsKICAgIHJlY2VpdmUoZGVwbG95OiBGYWN0b3J5RGVwbG95KSB7CiAgICAgICAgc2VsZi5mb3J3YXJk" + + "KGRlcGxveS5jYXNoYmFjaywgRGVwbG95T2t7cXVlcnlJZDogZGVwbG95LnF1ZXJ5SWR9LnRvQ2VsbCgpLCBmYWxzZSwgbnVsbCk7CiAgICB9Cn0="; +files["libs/dns.fc"] = + "c2xpY2UgZG5zX3N0cmluZ190b19pbnRlcm5hbChzbGljZSBkb21haW4pIGlubGluZV9yZWYgewoKICAgIDs7IFNwZWNpYWwgY2FzZSBmb3Igcm9vdCBkb21haW4KICAg" + + "IGlmICgoZG9tYWluLnNsaWNlX2JpdHMoKSA9PSA4KSAmIChkb21haW4uc2xpY2VfcmVmcygpID09IDApKSB7CiAgICAgICAgaWYgKGRvbWFpbi5wcmVsb2FkX3VpbnQo" + + "OCkgPT0gNDYpIHsKICAgICAgICAgICAgcmV0dXJuIGJlZ2luX2NlbGwoKS5zdG9yZV91aW50KDAsIDgpLmVuZF9jZWxsKCkuYmVnaW5fcGFyc2UoKTsKICAgICAgICB9" + + "CiAgICB9CiAgICAKICAgIDs7IFNwbGl0IGRvbWFpbiBpbnRvIHNlZ21lbnRzCiAgICB0dXBsZSBzZWdtZW50cyA9IG51bGwoKTsKICAgIGJ1aWxkZXIgY3VycmVudCA9" + + "IGJlZ2luX2NlbGwoKTsKICAgIGludCBpc0N1cnJlbnRFbXB0eSA9IHRydWU7CiAgICBpbnQgaXNGaXJzdCA9IHRydWU7CiAgICBpbnQgaXNIeXBoZW4gPSBmYWxzZTsK" + + "ICAgIHNsaWNlIGNzID0gZG9tYWluOwogICAgaW50IGNvbnRpbnVlID0gdHJ1ZTsKICAgIGRvIHsKCiAgICAgICAgOzsgUHJlcGFyZSBmb3IgbG9hZGluZyBuZXh0IGNo" + + "YXJhY3RlcgogICAgICAgIGlmIChjcy5zbGljZV9iaXRzKCkgPT0gMCkgewogICAgICAgICAgICBpbnQgcmVmcyA9IGNzLnNsaWNlX3JlZnMoKTsKICAgICAgICAgICAg" + + "aWYgKHJlZnMgPT0gMSkgewogICAgICAgICAgICAgICAgY3MgPSBjc35sb2FkX3JlZigpLmJlZ2luX3BhcnNlKCk7CiAgICAgICAgICAgIH0gZWxzZWlmIChyZWZzID4g" + + "MSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGwoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlID0gZmFsc2U7CiAgICAg" + + "ICAgICAgIH0KICAgICAgICAgICAgY29udGludWUgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIDs7IENvbnRpbnVlIGxvYWRpbmcgbmV4dCBjaGFyYWN0ZXIKICAg" + + "ICAgICBpZiAoY29udGludWUpIHsKICAgICAgICAgICAgaW50IGNoYXIgPSBjc35sb2FkX3VpbnQoOCk7CiAgICAgICAgICAgIDs7IHdlIGNhbiBkbyBpdCBiZWNhdXNl" + + "IGFkZGl0aW9uYWwgVVRGLTggY2hhcmFjdGVyJ3Mgb2N0ZXRzID49IDEyOCAtLSBodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzYyOS50eHQKICAgICAgICAgICAg" + + "aW50IGlzX2h5cGhlbiA9IChjaGFyID09IDQ1KTsKICAgICAgICAgICAgaW50IGlzX2RvdCAgPSAoY2hhciA9PSA0Nik7CiAgICAgICAgICAgIGludCB2YWxpZF9jaGFy" + + "ID0gaXNfaHlwaGVuIHwgaXNfZG90IHwgKChjaGFyID49IDQ4KSAmIChjaGFyIDw9IDU3KSkgfCAoKGNoYXIgPj0gOTcpICYgKGNoYXIgPD0gMTIyKSk7IDs7ICctJyBv" + + "ciAwLTkgb3IgYS16CiAgICAgICAgICAgIGlmICh+IHZhbGlkX2NoYXIgfCAoaXNGaXJzdCAmIGlzX2h5cGhlbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxs" + + "KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaXNIeXBoZW4gPSBpc19oeXBoZW47CiAgICAgICAgICAgIGlmIChpc19kb3QpIHsKICAgICAgICAgICAgICAgIGlm" + + "IChpc0ZpcnN0IHwgaXNIeXBoZW4pIHsgOzsgRW1wdHkgb3IgZW5kcyB3aXRoIGh5cGhlbgogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsKCk7CiAgICAgICAg" + + "ICAgICAgICB9CiAgICAgICAgICAgICAgICBzZWdtZW50cyA9IGNvbnMoY3VycmVudCwgc2VnbWVudHMpOwogICAgICAgICAgICAgICAgY3VycmVudCA9IGJlZ2luX2Nl" + + "bGwoKTsKICAgICAgICAgICAgICAgIGlzSHlwaGVuID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpc0ZpcnN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlzQ3VycmVu" + + "dEVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlzQ3VycmVudEVt" + + "cHR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBjdXJyZW50fnN0b3JlX3VpbnQoY2hhciwgOCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSB1bnRpbCAo" + + "fiBjb250aW51ZSk7CiAgICBpZiAoaXNIeXBoZW4pIHsgOzsgZW5kcyB3aXRoIGh5cGhlbgogICAgICAgIHJldHVybiBudWxsKCk7CiAgICB9CiAgICBpZiAofiBpc0N1" + + "cnJlbnRFbXB0eSkgewogICAgICAgIHNlZ21lbnRzID0gY29ucyhjdXJyZW50LCBzZWdtZW50cyk7CiAgICB9CgogICAgOzsgQ29uY2F0ZW5hdGUgc2VnbWVudHMKICAg" + + "IGJ1aWxkZXIgcmVzID0gYmVnaW5fY2VsbCgpOwogICAgKGJ1aWxkZXIgYiwgdHVwbGUgdGFpbCkgPSB1bmNvbnMoc2VnbWVudHMpOwogICAgcmVzID0gcmVzLnN0b3Jl" + + "X2J1aWxkZXIoYik7CiAgICB3aGlsZSh+IG51bGw/KHRhaWwpKSB7CiAgICAgICAgKGIsIHRhaWwpID0gdW5jb25zKHRhaWwpOwogICAgICAgIHJlcyA9IHJlcy5zdG9y" + + "ZV91aW50KDAsIDgpOyA7OyBBZGQgXDAgc2VwYXJhdG9yCiAgICAgICAgcmVzID0gcmVzLnN0b3JlX2J1aWxkZXIoYik7CiAgICB9CiAgICByZXMgPSByZXMuc3RvcmVf" + + "dWludCgwLCA4KTsgOzsgQWRkIFwwIHNlcGFyYXRvcgogICAgcmV0dXJuIHJlcy5lbmRfY2VsbCgpLmJlZ2luX3BhcnNlKCk7Cn0KCmludCBkbnNfaW50ZXJuYWxfdmVy" + + "aWZ5KHNsaWNlIHNjKSBpbmxpbmVfcmVmIHsKICAgIGlmIChzYy5zbGljZV9yZWZzKCkgIT0gMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGludCBi" + + "aXRzID0gc2Muc2xpY2VfYml0cygpOwogICAgaWYgKGJpdHMgJSA4ICE9IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoYml0cyA9PSAwKSB7" + + "IDs7IENhc2UgZm9yIHJvb3QgZG9tYWluCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpbnQgbGVuID0gYml0cyAvIDg7CiAgICBpbnQgY291bnRlciA9IDA7" + + "CiAgICBpbnQgaXNGaXJzdCA9IHRydWU7CiAgICBpbnQgaXNIeXBoZW4gPSBmYWxzZTsKICAgIHJlcGVhdChsZW4pIHsKICAgICAgICBpbnQgY2hhciA9IHNjfmxvYWRf" + + "dWludCg4KTsKICAgICAgICBpZiAoY2hhciA9PSAwKSB7CiAgICAgICAgICAgIGlmIChjb3VudGVyID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK" + + "ICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNIeXBoZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAg" + + "ICBjb3VudGVyID0gMDsKICAgICAgICAgICAgaXNIeXBoZW4gPSBmYWxzZTsKICAgICAgICAgICAgaXNGaXJzdCA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAg" + + "ICAgICAgaW50IGNoYXJJc0h5cGhlbiA9IChjaGFyID09IDQ1KTsKICAgICAgICAgICAgaW50IGlzVmFsaWQgPSBjaGFySXNIeXBoZW4gfCAoKGNoYXIgPj0gNDgpICYg" + + "KGNoYXIgPD0gNTcpKSB8ICgoY2hhciA+PSA5NykgJiAoY2hhciA8PSAxMjIpKTsKICAgICAgICAgICAgaWYgKH4gaXNWYWxpZCkgewogICAgICAgICAgICAgICAgcmV0" + + "dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGFySXNIeXBoZW4gJiBpc0ZpcnN0KSAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl" + + "OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlzSHlwaGVuID0gY2hhcklzSHlwaGVuOwogICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIGNv" + + "dW50ZXIgPSBjb3VudGVyICsgMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY291bnRlciA9PSAwICYgfiBpc0h5cGhlbjsKfQoKc2xpY2UgZG5zX2ludGVybmFs" + + "X25vcm1hbGl6ZShzbGljZSBzcmMpIGltcHVyZSBpbmxpbmVfcmVmIHsKICAgIHRocm93X3VubGVzcygxMzQsIHNyYy5zbGljZV9yZWZzKCkgPT0gMCk7IDs7IEludmFs" + + "aWQgYXJndW1lbnQgZXJyb3IKICAgIGJ1aWxkZXIgdGFyZ2V0ID0gYmVnaW5fY2VsbCgpOwogICAgcmVwZWF0KHNyYy5zbGljZV9iaXRzKCkgLyA4KSB7CiAgICAgICAg" + + "aW50IGNoYXIgPSBzcmN+bG9hZF91aW50KDgpOwoKICAgICAgICA7OyBiID0+IDYKICAgICAgICBpZiAoY2hhciA9PSA5OCkgewogICAgICAgICAgICBjaGFyID0gNTQ7" + + "CiAgICAgICAgfQoKICAgICAgICA7OyBnLCBxID0+IDkKICAgICAgICBpZiAoKGNoYXIgPT0gMTAzKSB8IChjaGFyID09IDExMykpIHsKICAgICAgICAgICAgY2hhciA9" + + "IDU3OyAgICAKICAgICAgICB9CgogICAgICAgIDs7IGwgPT4gMQogICAgICAgIGlmIChjaGFyID09IDEwOCkgewogICAgICAgICAgICBjaGFyID0gNDk7CiAgICAgICAg" + + "fQoKICAgICAgICA7OyBvID0+IDAKICAgICAgICBpZiAoY2hhciA9PSAxMTEpIHsKICAgICAgICAgICAgY2hhciA9IDQ4OwogICAgICAgIH0KCiAgICAgICAgOzsgcyA9" + + "PiA1CiAgICAgICAgaWYgKGNoYXIgPT0gMTE1KSB7CiAgICAgICAgICAgIGNoYXIgPSA1MzsKICAgICAgICB9CgogICAgICAgIDs7IHUgPT4gdgogICAgICAgIGlmIChj" + + "aGFyID09IDExNykgewogICAgICAgICAgICBjaGFyID0gMTE4OwogICAgICAgIH0KCiAgICAgICAgOzsgeiA9PiAyCiAgICAgICAgaWYgKGNoYXIgPT0gMTIyKSB7CiAg" + + "ICAgICAgICAgIGNoYXIgPSA1MDsKICAgICAgICB9CgogICAgICAgIHRhcmdldCA9IHRhcmdldC5zdG9yZV91aW50KGNoYXIsIDgpOwogICAgfQogICAgcmV0dXJuIHRh" + + "cmdldC5lbmRfY2VsbCgpLmJlZ2luX3BhcnNlKCk7Cn0K"; +files["libs/dns.tact"] = + "aW1wb3J0ICIuL2Rucy5mYyI7CgpzdHJ1Y3QgRE5TUmVzb2x2ZVJlc3VsdCB7CiAgICBwcmVmaXg6IEludDsgCiAgICByZWNvcmQ6IENlbGw/OyAKfQoKQG5hbWUoZG5z" + + "X3N0cmluZ190b19pbnRlcm5hbCkKbmF0aXZlIGRuc1N0cmluZ1RvSW50ZXJuYWwoc3RyOiBTdHJpbmcpOiBTbGljZT87CgpAbmFtZShkbnNfaW50ZXJuYWxfbm9ybWFs" + + "aXplKQpuYXRpdmUgZG5zSW50ZXJuYWxOb3JtYWxpemUoc3JjOiBTbGljZSk6IFNsaWNlOwoKQG5hbWUoZG5zX2ludGVybmFsX3ZlcmlmeSkKbmF0aXZlIGRuc0ludGVy" + + "bmFsVmVyaWZ5KHN1YmRvbWFpbjogU2xpY2UpOiBCb29sOwoKZnVuIGRuc0V4dHJhY3RUb3BEb21haW5MZW5ndGgoc3ViZG9tYWluOiBTbGljZSk6IEludCB7CiAgICBs" + + "ZXQgaTogSW50ID0gMDsKICAgIGxldCBuZWVkQnJlYWs6IEJvb2wgPSBmYWxzZTsKICAgIGRvIHsKICAgICAgICBsZXQgY2hhcjogSW50ID0gc3ViZG9tYWluLmxvYWRV" + + "aW50KDgpOyAvLyB3ZSBkbyBub3QgY2hlY2sgZG9tYWluLmxlbmd0aCBiZWNhdXNlIGl0IE1VU1QgY29udGFpbnMgXDAgY2hhcmFjdGVyCiAgICAgICAgbmVlZEJyZWFr" + + "ID0gY2hhciA9PSAwOwogICAgICAgIGlmICghbmVlZEJyZWFrKSB7CiAgICAgICAgICAgIGkgPSBpICsgODsKICAgICAgICB9CiAgICB9IHVudGlsIChuZWVkQnJlYWsp" + + "OwogICAgcmVxdWlyZShpICE9IDAsICJJbnZhbGlkIEROUyBuYW1lIik7CiAgICByZXR1cm4gaTsKfQoKZnVuIGRuc0V4dHJhY3RUb3BEb21haW4oc3ViZG9tYWluOiBT" + + "bGljZSk6IFNsaWNlIHsKICAgIGxldCBsZW46IEludCA9IGRuc0V4dHJhY3RUb3BEb21haW5MZW5ndGgoc3ViZG9tYWluKTsKICAgIHJldHVybiBzdWJkb21haW4ubG9h" + + "ZEJpdHMobGVuKTsKfQoKZnVuIGRuc1Jlc29sdmVOZXh0KGFkZHJlc3M6IEFkZHJlc3MpOiBDZWxsIHsKICAgIHJldHVybiBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9y" + + "ZVVpbnQoMHhiYTkzLCAxNikKICAgICAgICAuc3RvcmVBZGRyZXNzKGFkZHJlc3MpCiAgICAgICAgLmVuZENlbGwoKTsKfQoKZnVuIGRuc1Jlc29sdmVXYWxsZXQoYWRk" + + "cmVzczogQWRkcmVzcyk6IENlbGwgewogICAgcmV0dXJuIGJlZ2luQ2VsbCgpCiAgICAgICAgLnN0b3JlVWludCgweDlmZDMsIDE2KQogICAgICAgIC5zdG9yZUFkZHJl" + + "c3MoYWRkcmVzcykKICAgICAgICAuc3RvcmVVaW50KDAsIDgpCiAgICAgICAgLmVuZENlbGwoKTsKfQoKdHJhaXQgRE5TUmVzb2x2ZXIgewoKICAgIGdldCBmdW4gZG5z" + + "cmVzb2x2ZShzdWJkb21haW46IFNsaWNlLCBjYXRlZ29yeTogSW50KTogRE5TUmVzb2x2ZVJlc3VsdCB7CgogICAgICAgIC8vIE5vcm1hbGl6ZQogICAgICAgIGxldCBk" + + "ZWx0YTogSW50ID0gMDsKICAgICAgICBpZiAoc3ViZG9tYWluLnByZWxvYWRVaW50KDgpID09IDApIHsKICAgICAgICAgICAgc3ViZG9tYWluLmxvYWRVaW50KDgpOyAv" + + "LyBTa2lwIGZpcnN0IGJ5dGUKICAgICAgICAgICAgZGVsdGEgPSBkZWx0YSArIDg7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVja3MgY29ycmVjdG5lc3MKICAgICAg" + + "ICByZXF1aXJlKGRuc0ludGVybmFsVmVyaWZ5KHN1YmRvbWFpbiksICJJbnZhbGlkIEROUyBuYW1lIik7CgogICAgICAgIC8vIFJlc29sdmUKICAgICAgICBsZXQgcmVz" + + "OiBETlNSZXNvbHZlUmVzdWx0ID0gc2VsZi5kb1Jlc29sdmVETlMoc3ViZG9tYWluLCBjYXRlZ29yeSk7CiAgICAgICAgcmV0dXJuIEROU1Jlc29sdmVSZXN1bHR7cHJl" + + "Zml4OiByZXMucHJlZml4ICsgZGVsdGEsIHJlY29yZDogcmVzLnJlY29yZH07CiAgICB9CgogICAgdmlydHVhbCBmdW4gZG9SZXNvbHZlRE5TKHN1YmRvbWFpbjogU2xp" + + "Y2UsIGNhdGVnb3J5OiBJbnQpOiBETlNSZXNvbHZlUmVzdWx0IHsKICAgICAgICByZXR1cm4gRE5TUmVzb2x2ZVJlc3VsdHtwcmVmaXg6IHN1YmRvbWFpbi5iaXRzKCks" + + "IHJlY29yZDogbnVsbH07CiAgICB9Cn0="; +files["libs/ownable.tact"] = + "bWVzc2FnZSBDaGFuZ2VPd25lciB7CiAgICBxdWVyeUlkOiBJbnQgYXMgdWludDY0OwogICAgbmV3T3duZXI6IEFkZHJlc3M7Cn0KCm1lc3NhZ2UgQ2hhbmdlT3duZXJP" + + "ayB7CiAgICBxdWVyeUlkOiBJbnQgYXMgdWludDY0OwogICAgbmV3T3duZXI6IEFkZHJlc3M7Cn0KCkBpbnRlcmZhY2UoIm9yZy50b24ub3duYWJsZSIpCnRyYWl0IE93" + + "bmFibGUgewogICAgb3duZXI6IEFkZHJlc3M7CgogICAgZnVuIHJlcXVpcmVPd25lcigpIHsKICAgICAgICBuYXRpdmVUaHJvd1VubGVzcygxMzIsIHNlbmRlcigpID09" + + "IHNlbGYub3duZXIpOwogICAgfQoKICAgIGdldCBmdW4gb3duZXIoKTogQWRkcmVzcyB7CiAgICAgICAgcmV0dXJuIHNlbGYub3duZXI7CiAgICB9Cn0KCkBpbnRlcmZh" + + "Y2UoIm9yZy50b24ub3duYWJsZS50cmFuc2ZlcmFibGUudjIiKQp0cmFpdCBPd25hYmxlVHJhbnNmZXJhYmxlIHdpdGggT3duYWJsZSB7CgogICAgb3duZXI6IEFkZHJl" + + "c3M7CgogICAgcmVjZWl2ZShtc2c6IENoYW5nZU93bmVyKSB7CiAgICAgICAgCiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlbmRlciBpcyB0aGUgb3duZXIKICAgICAg" + + "ICBzZWxmLnJlcXVpcmVPd25lcigpOwoKICAgICAgICAvLyBVcGRhdGUgb3duZXIKICAgICAgICBzZWxmLm93bmVyID0gbXNnLm5ld093bmVyOwoKICAgICAgICAvLyBS" + + "ZXBseSByZXN1bHQKICAgICAgICBzZWxmLnJlcGx5KENoYW5nZU93bmVyT2t7IHF1ZXJ5SWQ6IG1zZy5xdWVyeUlkLCBuZXdPd25lcjptc2cubmV3T3duZXIgfS50b0Nl" + + "bGwoKSk7CiAgICB9Cn0="; +files["libs/stoppable.tact"] = + "aW1wb3J0ICIuL293bmFibGUiOwoKQGludGVyZmFjZSgib3JnLnRvbi5zdG9wcGFibGUiKQp0cmFpdCBTdG9wcGFibGUgd2l0aCBPd25hYmxlIHsKICAgIAogICAgc3Rv" + + "cHBlZDogQm9vbDsKICAgIG93bmVyOiBBZGRyZXNzOwoKICAgIGZ1biByZXF1aXJlTm90U3RvcHBlZCgpIHsKICAgICAgICByZXF1aXJlKCFzZWxmLnN0b3BwZWQsICJD" + + "b250cmFjdCBzdG9wcGVkIik7CiAgICB9CgogICAgZnVuIHJlcXVpcmVTdG9wcGVkKCkgewogICAgICAgIHJlcXVpcmUoc2VsZi5zdG9wcGVkLCAiQ29udHJhY3Qgbm90" + + "IHN0b3BwZWQiKTsKICAgIH0KCiAgICByZWNlaXZlKCJTdG9wIikgewogICAgICAgIHNlbGYucmVxdWlyZU93bmVyKCk7CiAgICAgICAgc2VsZi5yZXF1aXJlTm90U3Rv" + + "cHBlZCgpOwogICAgICAgIHNlbGYuc3RvcHBlZCA9IHRydWU7CiAgICAgICAgc2VsZi5yZXBseSgiU3RvcHBlZCIuYXNDb21tZW50KCkpOwogICAgfQoKICAgIGdldCBm" + + "dW4gc3RvcHBlZCgpOiBCb29sIHsKICAgICAgICByZXR1cm4gc2VsZi5zdG9wcGVkOwogICAgfQp9CgpAaW50ZXJmYWNlKCJvcmcudG9uLnJlc3VtYWJsZSIpCnRyYWl0" + + "IFJlc3VtYWJsZSB3aXRoIFN0b3BwYWJsZSB7CiAgICBzdG9wcGVkOiBCb29sOwogICAgb3duZXI6IEFkZHJlc3M7CgogICAgcmVjZWl2ZSgiUmVzdW1lIikgewogICAg" + + "ICAgIHNlbGYucmVxdWlyZU93bmVyKCk7CiAgICAgICAgc2VsZi5yZXF1aXJlU3RvcHBlZCgpOwogICAgICAgIHNlbGYuc3RvcHBlZCA9IGZhbHNlOwogICAgICAgIHNl" + + "bGYucmVwbHkoIlJlc3VtZWQiLmFzQ29tbWVudCgpKTsKICAgIH0KfQ=="; +files["std/base.tact"] = + "dHJhaXQgQmFzZVRyYWl0IHsKICAgIHZpcnR1YWwgY29uc3Qgc3RvcmFnZVJlc2VydmU6IEludCA9IDA7CiAgICAKICAgIHZpcnR1YWwgaW5saW5lIGZ1biByZXBseShi" + + "b2R5OiBDZWxsPykgewogICAgICAgIHNlbGYuZm9yd2FyZChzZW5kZXIoKSwgYm9keSwgdHJ1ZSwgbnVsbCk7CiAgICB9CgogICAgdmlydHVhbCBpbmxpbmUgZnVuIG5v" + + "dGlmeShib2R5OiBDZWxsPykgewogICAgICAgIHNlbGYuZm9yd2FyZChzZW5kZXIoKSwgYm9keSwgZmFsc2UsIG51bGwpOwogICAgfQoKICAgIHZpcnR1YWwgZnVuIGZv" + + "cndhcmQodG86IEFkZHJlc3MsIGJvZHk6IENlbGw/LCBib3VuY2U6IEJvb2wsIGluaXQ6IFN0YXRlSW5pdD8pIHsKCiAgICAgICAgbGV0IGNvZGU6IENlbGw/ID0gbnVs" + + "bDsKICAgICAgICBsZXQgZGF0YTogQ2VsbD8gPSBudWxsOwogICAgICAgIGlmIChpbml0ICE9IG51bGwpIHsKICAgICAgICAgICAgbGV0IGluaXQyOiBTdGF0ZUluaXQg" + + "PSBpbml0ISE7CiAgICAgICAgICAgIGNvZGUgPSBpbml0Mi5jb2RlOwogICAgICAgICAgICBkYXRhID0gaW5pdDIuZGF0YTsKICAgICAgICB9CgogICAgICAgIC8vIExv" + + "Y2sgc3RvcmFnZSBpZiBuZWVkZWQKICAgICAgICBpZiAoc2VsZi5zdG9yYWdlUmVzZXJ2ZSA+IDApIHsgLy8gT3B0aW1pemVkIGluIGNvbXBpbGUtdGltZQogICAgICAg" + + "ICAgICBsZXQgY3R4OiBDb250ZXh0ID0gY29udGV4dCgpOwogICAgICAgICAgICBsZXQgYmFsYW5jZTogSW50ID0gbXlCYWxhbmNlKCk7CiAgICAgICAgICAgIGxldCBi" + + "YWxhbmNlQmVmb3JlTWVzc2FnZTogSW50ID0gYmFsYW5jZSAtIGN0eC52YWx1ZTsKICAgICAgICAgICAgaWYgKGJhbGFuY2VCZWZvcmVNZXNzYWdlIDwgc2VsZi5zdG9y" + + "YWdlUmVzZXJ2ZSkgewogICAgICAgICAgICAgICAgbmF0aXZlUmVzZXJ2ZShzZWxmLnN0b3JhZ2VSZXNlcnZlLCBSZXNlcnZlRXhhY3QpOwogICAgICAgICAgICAgICAg" + + "c2VuZChTZW5kUGFyYW1ldGVyc3tib3VuY2U6IGJvdW5jZSwgdG86IHRvLCB2YWx1ZTogMCwgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UgfCBTZW5kSWdub3JlRXJy" + + "b3JzLCBib2R5OiBib2R5LCBjb2RlOiBjb2RlLCBkYXRhOiBkYXRhIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAg" + + "ICAgICAvLyBKdXN0IHNlbmQgd2l0aCByZW1haW5pbmcgYmFsYW5jZQogICAgICAgIHNlbmQoU2VuZFBhcmFtZXRlcnN7Ym91bmNlOiBib3VuY2UsIHRvOiB0bywgdmFs" + + "dWU6IDAsIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJvcnMsIGJvZHk6IGJvZHksIGNvZGU6IGNvZGUsIGRhdGE6IGRhdGEgfSk7CiAgICB9" + + "Cn0="; +files["std/cells.tact"] = + "Ly8KLy8gQnVpbGRlcgovLwoKYXNtIGZ1biBiZWdpbkNlbGwoKTogQnVpbGRlciB7IE5FV0MgfQoKLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwg" + + "c28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJTVElYIgpAbmFtZShzdG9yZV9pbnQpCmV4dGVuZHMgbmF0aXZlIHN0b3JlSW50KHNlbGY6IEJ1aWxkZXIsIHZhbHVlOiBJ" + + "bnQsIGJpdHM6IEludCk6IEJ1aWxkZXI7CgovLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVyLCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIlNUVVgi" + + "CkBuYW1lKHN0b3JlX3VpbnQpCmV4dGVuZHMgbmF0aXZlIHN0b3JlVWludChzZWxmOiBCdWlsZGVyLCB2YWx1ZTogSW50LCBiaXRzOiBJbnQpOiBCdWlsZGVyOwoKQG5h" + + "bWUoX190YWN0X3N0b3JlX2Jvb2wpCmV4dGVuZHMgbmF0aXZlIHN0b3JlQm9vbChzZWxmOiBCdWlsZGVyLCB2YWx1ZTogQm9vbCk6IEJ1aWxkZXI7CgovLy8gRXh0ZW5z" + + "aW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgLiBBbGlhcyB0byBgQnVpbGRlci5zdG9yZUJvb2woKWAuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgovLy8K" + + "Ly8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJ1aWxkZXIg" + + "PSBiLnN0b3JlQml0KHRydWUpOyAgLy8gd3JpdGVzIDEKLy8vICAgICBsZXQgYnV6ejogQnVpbGRlciA9IGIuc3RvcmVCaXQoZmFsc2UpOyAvLyB3cml0ZXMgMAovLy8g" + + "fQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmViaXQKLy8vCkBuYW1lKF9fdGFj" + + "dF9zdG9yZV9ib29sKQpleHRlbmRzIG5hdGl2ZSBzdG9yZUJpdChzZWxmOiBCdWlsZGVyLCB2YWx1ZTogQm9vbCk6IEJ1aWxkZXI7Cgphc20gZXh0ZW5kcyBmdW4gc3Rv" + + "cmVDb2lucyhzZWxmOiBCdWlsZGVyLCB2YWx1ZTogSW50KTogQnVpbGRlciB7IFNUVkFSVUlOVDE2IH0KCmFzbSBleHRlbmRzIGZ1biBzdG9yZVZhckludDE2KHNlbGY6" + + "IEJ1aWxkZXIsIHZhbHVlOiBJbnQpOiBCdWlsZGVyIHsgU1RWQVJJTlQxNiB9Cgphc20gZXh0ZW5kcyBmdW4gc3RvcmVWYXJJbnQzMihzZWxmOiBCdWlsZGVyLCB2YWx1" + + "ZTogSW50KTogQnVpbGRlciB7IFNUVkFSSU5UMzIgfQoKYXNtIGV4dGVuZHMgZnVuIHN0b3JlVmFyVWludDE2KHNlbGY6IEJ1aWxkZXIsIHZhbHVlOiBJbnQpOiBCdWls" + + "ZGVyIHsgU1RWQVJVSU5UMTYgfQoKYXNtIGV4dGVuZHMgZnVuIHN0b3JlVmFyVWludDMyKHNlbGY6IEJ1aWxkZXIsIHZhbHVlOiBJbnQpOiBCdWlsZGVyIHsgU1RWQVJV" + + "SU5UMzIgfQoKYXNtKGNlbGwgc2VsZikgZXh0ZW5kcyBmdW4gc3RvcmVSZWYoc2VsZjogQnVpbGRlciwgY2VsbDogQ2VsbCk6IEJ1aWxkZXIgeyBTVFJFRiB9Cgphc20g" + + "ZXh0ZW5kcyBmdW4gc3RvcmVTbGljZShzZWxmOiBCdWlsZGVyLCBjZWxsOiBTbGljZSk6IEJ1aWxkZXIgeyBTVFNMSUNFUiB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9u" + + "IGZvciB0aGUgYEJ1aWxkZXJgLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBBcHBlbmRzIGFsbCBkYXRhIGZyb20gYSBgQnVpbGRlcmAgYGNlbGxg" + + "IHRvIHRoZSBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuIFJldHVybnMgdGhhdCBjb3B5LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxl" + + "dCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCkuc3RvcmVDb2lucyg0Mik7Ci8vLyAgICAgbGV0IGZpeno6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKS5zdG9yZUJ1aWxkZXIo" + + "Yik7Ci8vLyAgICAgYi5lbmRDZWxsKCkgPT0gZml6ei5lbmRDZWxsKCk7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3Qt" + + "bGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcnN0b3JlYnVpbGRlcgovLy8KYXNtIGV4dGVuZHMgZnVuIHN0b3JlQnVpbGRlcihzZWxmOiBCdWlsZGVyLCBjZWxs" + + "OiBCdWlsZGVyKTogQnVpbGRlciB7IFNUQlIgfQoKQG5hbWUoX190YWN0X3N0b3JlX2FkZHJlc3MpCmV4dGVuZHMgbmF0aXZlIHN0b3JlQWRkcmVzcyhzZWxmOiBCdWls" + + "ZGVyLCBhZGRyZXNzOiBBZGRyZXNzKTogQnVpbGRlcjsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAuIEF2YWlsYWJsZSBzaW5jZSBUYWN0" + + "IDEuNS4wLgovLy8KLy8vIElmIHRoZSBgY2VsbGAgaXMgbm90IGBudWxsYCwgc3RvcmVzIDEgYXMgYSBzaW5nbGUgYml0IGFuZCB0aGVuIHJlZmVyZW5jZSBgY2VsbGAg" + + "aW50byB0aGUgY29weSBvZiB0aGUgYEJ1aWxkZXJgLiBSZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBJZiB0aGUgYGNlbGxgIGlzIGBudWxsYCwgb25seSBzdG9yZXMg" + + "MCBhcyBhIHNpbmdsZSBiaXQgaW50byB0aGUgY29weSBvZiB0aGUgYEJ1aWxkZXJgLiBSZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBBcyBhIHNpbmdsZSBgQ2VsbGAg" + + "Y2FuIHN0b3JlIHVwIHRvIDQgcmVmZXJlbmNlcywgYXR0ZW1wdHMgdG8gc3RvcmUgbW9yZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgODogYENlbGwg" + + "b3ZlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0" + + "IGZpeno6IEJ1aWxkZXIgPSBiCi8vLyAgICAgICAgIC5zdG9yZU1heWJlUmVmKGVtcHR5Q2VsbCgpKSAvLyAxLCB0aGVuIGVtcHR5IGNlbGwKLy8vICAgICAgICAgLnN0" + + "b3JlTWF5YmVSZWYobnVsbCk7ICAgICAgIC8vIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2Vs" + + "bHMjYnVpbGRlcnN0b3JlbWF5YmVyZWYKLy8vCmFzbShjZWxsIHNlbGYpIGV4dGVuZHMgZnVuIHN0b3JlTWF5YmVSZWYoc2VsZjogQnVpbGRlciwgY2VsbDogQ2VsbD8p" + + "OiBCdWlsZGVyIHsgU1RPUFRSRUYgfQoKYXNtIGV4dGVuZHMgZnVuIGVuZENlbGwoc2VsZjogQnVpbGRlcik6IENlbGwgeyBFTkRDIH0KCmFzbSBleHRlbmRzIGZ1biBy" + + "ZWZzKHNlbGY6IEJ1aWxkZXIpOiBJbnQgeyBCUkVGUyB9Cgphc20gZXh0ZW5kcyBmdW4gYml0cyhzZWxmOiBCdWlsZGVyKTogSW50IHsgQkJJVFMgfQoKLy8KLy8gU2xp" + + "Y2UKLy8KCmFzbSBleHRlbmRzIGZ1biBiZWdpblBhcnNlKHNlbGY6IENlbGwpOiBTbGljZSB7IENUT1MgfQoKYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBs" + + "b2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IExEUkVGIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgLiBBdmFpbGFibGUgc2luY2UgVGFj" + + "dCAxLjUuMC4KLy8vCi8vLyBQcmVsb2FkcyB0aGUgbmV4dCByZWZlcmVuY2UgZnJvbSB0aGUgYFNsaWNlYCBhcyBhIGBDZWxsYC4gRG9lc24ndCBtb2RpZnkgdGhlIG9y" + + "aWdpbmFsIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBzdWNoIHJlZmVyZW5jZSBgQ2VsbGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBp" + + "dCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgODogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHByZWxvYWQgbW9yZSBkYXRhIHRo" + + "YW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBm" + + "dW4gZXhhbXBsZXMoKSB7Ci8vLyAgICAgbGV0IHMxOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0" + + "IGZpeno6IENlbGwgPSBzMS5wcmVsb2FkUmVmKCk7IC8vIGRpZG4ndCBtb2RpZnkgczEKLy8vCi8vLyAgICAgbGV0IHMyOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAg" + + "ICAgICAgIC5zdG9yZVJlZihlbXB0eUNlbGwoKSkKLy8vICAgICAgICAgLnN0b3JlUmVmKHMxLmFzQ2VsbCgpKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8gICAg" + + "IGxldCByZWYxOiBDZWxsID0gczIucHJlbG9hZFJlZigpOwovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIucHJlbG9hZFJlZigpOwovLy8gICAgIHJlZjEgPT0gcmVm" + + "MjsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXByZWxv" + + "YWRyZWYKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwphc20gZXh0ZW5kcyBmdW4gcHJlbG9hZFJlZihzZWxmOiBTbGlj" + + "ZSk6IENlbGwgeyBQTERSRUYgfQoKLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJMRFNMSUNFWCIK" + + "QG5hbWUobG9hZF9iaXRzKQpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBTbGljZTsKCi8vIHNwZWNpYWwgdHJlYXRt" + + "ZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiUExEU0xJQ0VYIgpAbmFtZShwcmVsb2FkX2JpdHMpCmV4dGVuZHMgbmF0aXZlIHBy" + + "ZWxvYWRCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBTbGljZTsKCi8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3" + + "aXRoIGFzbSAiTERJWCIKQG5hbWUobG9hZF9pbnQpCmV4dGVuZHMgbXV0YXRlcyBuYXRpdmUgbG9hZEludChzZWxmOiBTbGljZSwgbDogSW50KTogSW50OwoKLy8gc3Bl" + + "Y2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERJWCIKQG5hbWUocHJlbG9hZF9pbnQpCmV4dGVuZHMgbmF0" + + "aXZlIHByZWxvYWRJbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNl" + + "ZCB3aXRoIGFzbSAiTERVWCIKQG5hbWUobG9hZF91aW50KQpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRVaW50KHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBJbnQ7Cgov" + + "LyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVyLCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIlBMRFVYIgpAbmFtZShwcmVsb2FkX3VpbnQpCmV4dGVu" + + "ZHMgbmF0aXZlIHByZWxvYWRVaW50KHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBJbnQ7Cgphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRCb29sKHNlbGY6" + + "IFNsaWNlKTogQm9vbCB7IDEgTERJIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgLiBBbGlhcyB0byBgU2xpY2UubG9hZEJv" + + "b2woKWAuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJl" + + "Z2luQ2VsbCgpLnN0b3JlQm9vbCh0cnVlKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmxvYWRCaXQoKTsgLy8gdHJ1ZQovLy8gfQovLy8gYGBg" + + "Ci8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRiaXQKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0" + + "YXRlcyBmdW4gbG9hZEJpdChzZWxmOiBTbGljZSk6IEJvb2wgeyAxIExESSB9Cgphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkQ29pbnMoc2VsZjog" + + "U2xpY2UpOiBJbnQgeyBMRFZBUlVJTlQxNiB9CgpAbmFtZShfX3RhY3RfbG9hZF9hZGRyZXNzKQpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRBZGRyZXNzKHNlbGY6" + + "IFNsaWNlKTogQWRkcmVzczsKCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpIHsgU0RTS0lQRklSU1QgfQoKYXNtIGV4" + + "dGVuZHMgZnVuIGVuZFBhcnNlKHNlbGY6IFNsaWNlKSB7IEVORFMgfQoKLy8KLy8gU2xpY2Ugc2l6ZQovLwoKYXNtIGV4dGVuZHMgZnVuIHJlZnMoc2VsZjogU2xpY2Up" + + "OiBJbnQgeyBTUkVGUyB9Cgphc20gZXh0ZW5kcyBmdW4gYml0cyhzZWxmOiBTbGljZSk6IEludCB7IFNCSVRTIH0KCmFzbSBleHRlbmRzIGZ1biBlbXB0eShzZWxmOiBT" + + "bGljZSk6IEJvb2wgeyBTRU1QVFkgfQoKYXNtIGV4dGVuZHMgZnVuIGRhdGFFbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTREVNUFRZIH0KCmFzbSBleHRlbmRzIGZ1" + + "biByZWZzRW1wdHkoc2VsZjogU2xpY2UpOiBCb29sIHsgU1JFTVBUWSB9CgovLwovLyBDb252ZXJzaW9ucwovLwoKaW5saW5lIGV4dGVuZHMgZnVuIGFzU2xpY2Uoc2Vs" + + "ZjogQnVpbGRlcik6IFNsaWNlIHsKICAgIHJldHVybiBzZWxmLmVuZENlbGwoKS5iZWdpblBhcnNlKCk7Cn0KCmlubGluZSBleHRlbmRzIGZ1biBhc1NsaWNlKHNlbGY6" + + "IENlbGwpOiBTbGljZSB7CiAgICByZXR1cm4gc2VsZi5iZWdpblBhcnNlKCk7Cn0KCmlubGluZSBleHRlbmRzIGZ1biBhc0NlbGwoc2VsZjogU2xpY2UpOiBDZWxsIHsK" + + "ICAgIHJldHVybiBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVNsaWNlKHNlbGYpCiAgICAgICAgLmVuZENlbGwoKTsKfQoKaW5saW5lIGV4dGVuZHMgZnVuIGFzQ2Vs" + + "bChzZWxmOiBCdWlsZGVyKTogQ2VsbCB7CiAgICByZXR1cm4gc2VsZi5lbmRDZWxsKCk7Cn0KCmlubGluZSBmdW4gZW1wdHlDZWxsKCk6IENlbGwgewogICAgcmV0dXJu" + + "IGJlZ2luQ2VsbCgpLmVuZENlbGwoKTsKfQoKaW5saW5lIGZ1biBlbXB0eVNsaWNlKCk6IFNsaWNlIHsKICAgIHJldHVybiBlbXB0eUNlbGwoKS5hc1NsaWNlKCk7Cn0K"; +files["std/config.tact"] = + "YXNtIGZ1biBnZXRDb25maWdQYXJhbShpZDogSW50KTogQ2VsbD8geyBDT05GSUdPUFRQQVJBTSB9Cg=="; +files["std/context.tact"] = + "c3RydWN0IENvbnRleHQgewogICAgYm91bmNlZDogQm9vbDsKICAgIHNlbmRlcjogQWRkcmVzczsKICAgIHZhbHVlOiBJbnQ7CiAgICByYXc6IFNsaWNlOwp9CgpAbmFt" + + "ZShfX3RhY3RfY29udGV4dF9nZXQpCm5hdGl2ZSBjb250ZXh0KCk6IENvbnRleHQ7CgpAbmFtZShfX3RhY3RfY29udGV4dF9nZXRfc2VuZGVyKQpuYXRpdmUgc2VuZGVy" + + "KCk6IEFkZHJlc3M7CgpleHRlbmRzIGZ1biByZWFkRm9yd2FyZEZlZShzZWxmOiBDb250ZXh0KTogSW50IHsKICAgIGxldCBzYzogU2xpY2UgPSBzZWxmLnJhdzsKICAg" + + "IHNjLmxvYWRBZGRyZXNzKCk7IC8vIFNraXAgZGVzdGluYXRpb24KICAgIHNjLmxvYWRDb2lucygpOyAvLyBTa2lwIHZhbHVlCiAgICBzYy5za2lwQml0cygxKTsgLy8g" + + "U2tpcCBleHRyYSBjdXJyZW5jeSBjb2xsZWN0aW9uCiAgICBzYy5sb2FkQ29pbnMoKTsgLy8gU2tpcCBpaHJfZmVlCiAgICByZXR1cm4gKHNjLmxvYWRDb2lucygpICog" + + "MykgLyAyOwp9"; +files["std/contract.tact"] = + "c3RydWN0IFN0YXRlSW5pdCB7CiAgICBjb2RlOiBDZWxsOwogICAgZGF0YTogQ2VsbDsKfQoKQG5hbWUoX190YWN0X2NvbXB1dGVfY29udHJhY3RfYWRkcmVzcykKbmF0" + + "aXZlIGNvbnRyYWN0QWRkcmVzc0V4dChjaGFpbjogSW50LCBjb2RlOiBDZWxsLCBkYXRhOiBDZWxsKTogQWRkcmVzczsKCmlubGluZSBmdW4gY29udHJhY3RBZGRyZXNz" + + "KHM6IFN0YXRlSW5pdCk6IEFkZHJlc3MgewogICAgcmV0dXJuIGNvbnRyYWN0QWRkcmVzc0V4dCgwLCBzLmNvZGUsIHMuZGF0YSk7Cn0KCkBuYW1lKF9fdGFjdF9hZGRy" + + "ZXNzX3RvX3NsaWNlKQpleHRlbmRzIG5hdGl2ZSBhc1NsaWNlKHNlbGY6IEFkZHJlc3MpOiBTbGljZTsKCkBuYW1lKF9fdGFjdF9jcmVhdGVfYWRkcmVzcykKbmF0aXZl" + + "IG5ld0FkZHJlc3MoY2hhaW46IEludCwgaGFzaDogSW50KTogQWRkcmVzczsKCmFzbSBmdW4gbXlBZGRyZXNzKCk6IEFkZHJlc3MgeyBNWUFERFIgfQoKYXNtIGZ1biBt" + + "eUJhbGFuY2UoKTogSW50IHsgQkFMQU5DRSBGSVJTVCB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBSZXR1" + + "cm5zIHRoZSBuYW5vVG9uY29pbiBgSW50YCBhbW91bnQgb2YgZ2FzIGNvbnN1bWVkIGJ5IFRWTSBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBzbyBmYXIuIFRoZSBy" + + "ZXN1bHRpbmcgdmFsdWUgaW5jbHVkZXMgdGhlIGNvc3Qgb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewov" + + "Ly8gICAgIGxldCBnYXM6IEludCA9IGdhc0NvbnN1bWVkKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9j" + + "b3JlLWFkdmFuY2VkI2dhc2NvbnN1bWVkCi8vLwphc20gZnVuIGdhc0NvbnN1bWVkKCk6IEludCB7IEdBU0NPTlNVTUVEIH0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2" + + "YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgovLy8KLy8vIFJldHVybnMgdGhlIG5hbm9Ub25jb2luIGBJbnRgIGFtb3VudCBvZiB0aGUgYWNjdW11bGF0ZWQgc3RvcmFn" + + "ZSBmZWUgZGVidC4gU3RvcmFnZSBmZWVzIGFyZSBkZWR1Y3RlZCBmcm9tIHRoZSBpbmNvbWluZyBtZXNzYWdlIHZhbHVlIGJlZm9yZSB0aGUgbmV3IGNvbnRyYWN0IGJh" + + "bGFuY2UgaXMgY2FsY3VsYXRlZC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgZGVidDogSW50ID0gbXlTdG9yYWdlRHVlKCk7" + + "Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkdmFuY2VkI215c3RvcmFnZWR1ZQovLy8KYXNtIGZ1" + + "biBteVN0b3JhZ2VEdWUoKTogSW50IHsgRFVFUEFZTUVOVCB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBD" + + "YWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBzdG9yYWdlIGZlZSBpbiBuYW5vVG9uY29pbnMgYEludGAgZm9yIHN0b3JpbmcgYSBjb250cmFjdCB3aXRoIGEgZ2l2ZW4g" + + "bnVtYmVyIG9mIGBjZWxsc2AgYW5kIGBiaXRzYCBmb3IgYSBudW1iZXIgb2YgYHNlY29uZHNgLiBVc2VzIHRoZSBwcmljZXMgb2YgdGhlIG1hc3RlcmNoYWluIGlmIGBp" + + "c01hc3RlcmNoYWluYCBpcyBgdHJ1ZWAsIG90aGVyd2lzZSB0aGUgcHJpY2VzIG9mIHRoZSBiYXNlY2hhaW4uIFRoZSBjdXJyZW50IHByaWNlcyBhcmUgb2J0YWluZWQg" + + "ZnJvbSB0aGUgY29uZmlnIHBhcmFtIDE4IG9mIFRPTiBCbG9ja2NoYWluLgovLy8KLy8vIE5vdGUsIHRoYXQgdGhlIHZhbHVlcyBvZiBgY2VsbHNgIGFuZCBgYml0c2Ag" + + "YXJlIHRha2VuIG1vZHVsbyB0aGVpciBtYXhpbXVtIHZhbHVlcyBwbHVzIDEuIFRoYXQgaXMsIHNwZWNpZnlpbmcgdmFsdWVzIGhpZ2hlciB0aGFuIHRob3NlIGxpc3Rl" + + "ZCBpbiBhY2NvdW50IHN0YXRlIGxpbWl0cyAoYG1heF9hY2Nfc3RhdGVfY2VsbHNgIGFuZCBgbWF4X2FjY19zdGF0ZV9iaXRzYCkgd2lsbCBoYXZlIHRoZSBzYW1lIHJl" + + "c3VsdCBhcyB3aXRoIHNwZWNpZnlpbmcgdGhlIGV4YWN0IGxpbWl0cy4gSW4gYWRkaXRpb24sIG1ha2Ugc3VyZSB5b3UgdGFrZSBpbnRvIGFjY291bnQgdGhlIGRlZHVw" + + "bGljYXRpb24gb2YgY2VsbHMgd2l0aCB0aGUgc2FtZSBoYXNoLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgbmVnYXRpdmUgbnVtYmVyIG9mIGBjZWxsc2AsIGBi" + + "aXRzYCBvciBgc2Vjb25kc2AgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDU6IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8g" + + "YGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGZlZTogSW50ID0gZ2V0U3RvcmFnZUZlZSgxXzAwMCwgMV8wMDAsIDFfMDAwLCBmYWxzZSk7Ci8v" + + "LyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkdmFuY2VkI2dldHN0b3JhZ2VmZWUKLy8vICog" + + "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0c2ltcGxlc3RvcmFnZWZlZQovLy8KYXNtIGZ1biBnZXRTdG9yYWdlRmVlKGNlbGxz" + + "OiBJbnQsIGJpdHM6IEludCwgc2Vjb25kczogSW50LCBpc01hc3RlcmNoYWluOiBCb29sKTogSW50IHsgR0VUU1RPUkFHRUZFRSB9CgovLy8gR2xvYmFsIGZ1bmN0aW9u" + + "LiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBjb21wdXRlIGZlZSBpbiBuYW5vVG9uY29pbnMgYElu" + + "dGAgZm9yIGEgdHJhbnNhY3Rpb24gdGhhdCBjb25zdW1lZCBgZ2FzVXNlZGAgYW1vdW50IG9mIGdhcy4gVXNlcyB0aGUgcHJpY2VzIG9mIHRoZSBtYXN0ZXJjaGFpbiBp" + + "ZiBgaXNNYXN0ZXJjaGFpbmAgaXMgYHRydWVgLCBvdGhlcndpc2UgdGhlIHByaWNlcyBvZiB0aGUgYmFzZWNoYWluLiBUaGUgY3VycmVudCBwcmljZXMgYXJlIG9idGFp" + + "bmVkIGZyb20gdGhlIGNvbmZpZyBwYXJhbSAyMCBmb3IgdGhlIG1hc3RlcmNoYWluIGFuZCBjb25maWcgcGFyYW0gMjEgZm9yIHRoZSBiYXNlY2hhaW4gb2YgVE9OIEJs" + + "b2NrY2hhaW4uCi8vLwovLy8gV2hlbiB0aGUgYGdhc1VzZWRgIGlzIGxlc3MgdGhhbiBhIGNlcnRhaW4gdGhyZXNob2xkIGNhbGxlZCBgZmxhdF9nYXNfbGltaXRgLCB0" + + "aGVyZSdzIGEgbWluaW11bSBwcmljZSB0byBwYXkgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGBmbGF0X2dhc19wcmljZWAuIFRoZSBsZXNzIGdhcyBpcyB1c2VkIGJlbG93" + + "IHRoaXMgdGhyZXNob2xkLCB0aGUgaGlnaGVyIHRoZSBtaW5pbXVtIHByaWNlIHdpbGwgYmUuIFNlZSB0aGUgZXhhbXBsZSBmb3IgYGdldFNpbXBsZUNvbXB1dGVGZWUo" + + "KWAgdG8gZGVyaXZlIHRoYXQgdGhyZXNob2xkLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgbmVnYXRpdmUgdmFsdWUgb2YgYGdhc1VzZWRgIHRocm93IGFuIGV4" + + "Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA1OiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewov" + + "Ly8gICAgIGxldCBmZWU6IEludCA9IGdldENvbXB1dGVGZWUoMV8wMDAsIGZhbHNlKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3Qt" + + "bGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0Y29tcHV0ZWZlZQovLy8KYXNtIGZ1biBnZXRDb21wdXRlRmVlKGdhc1VzZWQ6IEludCwgaXNNYXN0ZXJjaGFpbjog" + + "Qm9vbCk6IEludCB7IEdFVEdBU0ZFRSB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBTaW1pbGFyIHRvIGBn" + + "ZXRDb21wdXRlRmVlKClgLCBidXQgd2l0aG91dCB0aGUgYGZsYXRfZ2FzX3ByaWNlYCwgaS5lLiB3aXRob3V0IGEgbWluaW11bSBwcmljZSB0byBwYXkgaWYgdGhlIGBn" + + "YXNVc2VkYCBpcyBsZXNzIHRoYW4gYSBjZXJ0YWluIHRocmVzaG9sZCBjYWxsZWQgYGZsYXRfZ2FzX2xpbWl0YC4gQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyBvbmx5IHRo" + + "ZSBgZ2FzVXNlZGAgdGltZXMgdGhlIGN1cnJlbnQgZ2FzIHByaWNlLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgbmVnYXRpdmUgbnVtYmVyIG9mIGBjZWxsc2As" + + "IGBiaXRzYCBvciBgc2Vjb25kc2AgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDU6IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwov" + + "Ly8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGZlZSA9IGdldENvbXB1dGVGZWUoMCwgZmFsc2UpOwovLy8gICAgIGxldCBmZWVOb0ZsYXQg" + + "PSBnZXRTaW1wbGVDb21wdXRlRmVlKDAsIGZhbHNlKTsKLy8vICAgICBsZXQgbWF4RmxhdFByaWNlID0gZmVlIC0gZmVlTm9GbGF0OwovLy8gfQovLy8gYGBgCi8vLwov" + + "Ly8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1hZHZhbmNlZCNnZXRzaW1wbGVzdG9yYWdlZmVlCi8vLyAqIGh0dHBzOi8vZG9j" + + "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkdmFuY2VkI2dldHN0b3JhZ2VmZWUKLy8vCmFzbSBmdW4gZ2V0U2ltcGxlQ29tcHV0ZUZlZShnYXNVc2VkOiBJbnQsIGlz" + + "TWFzdGVyY2hhaW46IEJvb2wpOiBJbnQgeyBHRVRHQVNGRUVTSU1QTEUgfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8v" + + "LwovLy8gQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgZm9yd2FyZCBmZWUgaW4gbmFub1RvbmNvaW5zIGBJbnRgIGZvciBhbiBvdXRnb2luZyBtZXNzYWdlIGNvbnNp" + + "c3Rpbmcgb2YgYSBnaXZlbiBudW1iZXIgb2YgYGNlbGxzYCBhbmQgYGJpdHNgLiBVc2VzIHRoZSBwcmljZXMgb2YgdGhlIG1hc3RlcmNoYWluIGlmIGBpc01hc3RlcmNo" + + "YWluYCBpcyBgdHJ1ZXs6dGFjdH1gLCBvdGhlcndpc2UgdGhlIHByaWNlcyBvZiB0aGUgYmFzZWNoYWluLiBUaGUgY3VycmVudCBwcmljZXMgYXJlIG9idGFpbmVkIGZy" + + "b20gdGhlIGNvbmZpZyBwYXJhbSAyNCBmb3IgdGhlIG1hc3RlcmNoYWluIGFuZCBjb25maWcgcGFyYW0gMjUgZm9yIHRoZSBiYXNlY2hhaW4gb2YgVE9OIEJsb2NrY2hh" + + "aW4uCi8vLwovLy8gSWYgYm90aCB0aGUgc291cmNlIGFuZCB0aGUgZGVzdGluYXRpb24gYWRkcmVzc2VzIGFyZSBpbiB0aGUgYmFzZWNoYWluLCB0aGVuIHNwZWNpZnkg" + + "YGlzTWFzdGVyY2hhaW5gIGFzIGBmYWxzZWAuIE90aGVyd2lzZSwgc3BlY2lmeSBgdHJ1ZWAuCi8vLwovLy8gTm90ZSwgdGhhdCB0aGUgdmFsdWVzIG9mIGBjZWxsc2Ag" + + "YW5kIGBiaXRzYCBhcmUgdGFrZW4gbW9kdWxvIHRoZWlyIG1heGltdW0gdmFsdWVzIHBsdXMgMS4gVGhhdCBpcywgc3BlY2lmeWluZyB2YWx1ZXMgaGlnaGVyIHRoYW4g" + + "dGhvc2UgbGlzdGVkIGluIGFjY291bnQgc3RhdGUgbGltaXRzIChgbWF4X21zZ19jZWxsc2AgYW5kIGBtYXhfbXNnX2JpdHNgKSB3aWxsIGhhdmUgdGhlIHNhbWUgcmVz" + + "dWx0IGFzIHdpdGggc3BlY2lmeWluZyB0aGUgZXhhY3QgbGltaXRzLgovLy8KLy8vIEhvd2V2ZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlcyBvZiBgY2VsbHNgIGFu" + + "ZCBgYml0c2AsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIGFkZHMgdGhlIG1pbmltdW0gcHJpY2UgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGBsdW1wX3ByaWNlYC4gU2VlIHRo" + + "ZSBleGFtcGxlIGZvciBbYGdldFNpbXBsZUZvcndhcmRGZWUoKXs6dGFjdH1gXSgjZ2V0c2ltcGxlZm9yd2FyZGZlZSkgdG8gZGVyaXZlIGl0LiBJbiBhZGRpdGlvbiwg" + + "bWFrZSBzdXJlIHlvdSB0YWtlIGludG8gYWNjb3VudCB0aGUgZGVkdXBsaWNhdGlvbiBvZiBjZWxscyB3aXRoIHRoZSBzYW1lIGhhc2gsIHNpbmNlIGZvciBleGFtcGxl" + + "IHRoZSByb290IGNlbGwgYW5kIGl0cyBkYXRhIGJpdHMgZG9uJ3QgY291bnQgdG93YXJkcyB0aGUgZm9yd2FyZCBmZWUgYW5kIGFyZSBjb3ZlcmVkIGJ5IHRoZSBgbHVt" + + "cF9wcmljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBuZWdhdGl2ZSBudW1iZXIgb2YgYGNlbGxzYCBvciBgYml0c2AgdGhyb3cgYW4gZXhjZXB0aW9uIHdp" + + "dGggZXhpdCBjb2RlIDU6IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0" + + "IGZlZTogSW50ID0gZ2V0Rm9yd2FyZEZlZSgxXzAwMCwgMV8wMDAsIGZhbHNlKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRh" + + "Y3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0Zm9yd2FyZGZlZQovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1hZHZhbmNlZCNn" + + "ZXRzaW1wbGVmb3J3YXJkZmVlCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkdmFuY2VkI2dldG9yaWdpbmFsZndkZmVlCi8vLwphc20g" + + "ZnVuIGdldEZvcndhcmRGZWUoY2VsbHM6IEludCwgYml0czogSW50LCBpc01hc3RlcmNoYWluOiBCb29sKTogSW50IHsgR0VURk9SV0FSREZFRSB9CgovLy8gR2xvYmFs" + + "IGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBTaW1pbGFyIHRvIGBnZXRGb3J3YXJkRmVlKClgLCBidXQgd2l0aG91dCB0aGUgYGx1" + + "bXBfcHJpY2VgLCBpLmUuIHdpdGhvdXQgdGhlIG1pbmltdW0gcHJpY2UgdG8gcGF5IHJlZ2FyZGxlc3Mgb2YgdGhlIGFtb3VudCBvZiBgY2VsbHNgIG9yIGBiaXRzYC4g" + + "Q2FsY3VsYXRlcyBhbmQgcmV0dXJucyBvbmx5IHRoZSBgY2VsbHNgIHRpbWVzIHRoZSBjdXJyZW50IGNlbGwgcHJpY2UgcGx1cyBgYml0c2AgdGltZXMgdGhlIGN1cnJl" + + "bnQgYml0IHByaWNlLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgbmVnYXRpdmUgbnVtYmVyIG9mIGBjZWxsc2Agb3IgYGJpdHNgIHRocm93IGFuIGV4Y2VwdGlv" + + "biB3aXRoIGV4aXQgY29kZSA1OiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAg" + + "IGxldCBmZWUgPSBnZXRGb3J3YXJkRmVlKDFfMDAwLCAxXzAwMCwgZmFsc2UpOwovLy8gICAgIGxldCBmZWVOb0x1bXAgPSBnZXRTaW1wbGVGb3J3YXJkRmVlKDFfMDAw" + + "LCAxXzAwMCwgZmFsc2UpOwovLy8gICAgIGxldCBsdW1wUHJpY2UgPSBmZWUgLSBmZWVOb0x1bXA7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBz" + + "Oi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkdmFuY2VkI2dldHNpbXBsZWZvcndhcmRmZWUKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" + + "L2NvcmUtYWR2YW5jZWQjZ2V0Zm9yd2FyZGZlZQovLy8KYXNtIGZ1biBnZXRTaW1wbGVGb3J3YXJkRmVlKGNlbGxzOiBJbnQsIGJpdHM6IEludCwgaXNNYXN0ZXJjaGFp" + + "bjogQm9vbCk6IEludCB7IEdFVEZPUldBUkRGRUVTSU1QTEUgfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8g" + + "Q2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgc28tY2FsbGVkIF9vcmlnaW5hbF8gZm9yd2FyZCBmZWUgaW4gbmFub1RvbmNvaW5zIGBJbnRgIGZvciBhbiBvdXRnb2lu" + + "ZyBtZXNzYWdlIGJhc2VkIG9uIHRoZSBgZndkRmVlYCBvYnRhaW5lZCBmcm9tIHRoZSBpbmNvbWluZyBtZXNzYWdlLiBJZiBib3RoIHRoZSBzb3VyY2UgYW5kIHRoZSBk" + + "ZXN0aW5hdGlvbiBhZGRyZXNzZXMgYXJlIGluIHRoZSBiYXNlY2hhaW4sIHRoZW4gc3BlY2lmeSBgaXNNYXN0ZXJjaGFpbmAgYXMgYGZhbHNlYC4gT3RoZXJ3aXNlLCBz" + + "cGVjaWZ5IGB0cnVlYC4KLy8vCi8vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHRoZSBvdXRnb2luZyBtZXNzYWdlIGRlcGVuZHMgaGVhdmlseSBvbiB0aGUg" + + "c3RydWN0dXJlIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlLCBzbyBtdWNoIHNvIHRoYXQgeW91IGNhbm5vdCBmdWxseSBwcmVkaWN0IHRoZSBmZWUgdXNpbmcgYGdldEZv" + + "cndhcmRGZWUoKWAgYWxvbmUuIEV2ZW4gaWYgeW91IGNvdWxkLCBjYWxjdWxhdGluZyB0aGUgZXhhY3QgZmVlIHdpdGggbmFub1RvbmNvaW4tbGV2ZWwgcHJlY2lzaW9u" + + "IGNhbiBiZSB2ZXJ5IGV4cGVuc2l2ZSwgc28gdGhlIGFwcHJveGltYXRlIHZhbHVlIGdpdmVuIGJ5IHRoaXMgZnVuY3Rpb24gaXMgb2Z0ZW4gZ29vZCBlbm91Z2guCi8v" + + "LwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhIG5lZ2F0aXZlIHZhbHVlIG9mIGBmd2RGZWVgIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA1OiBgSW50" + + "ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBmd2RGZWU6IEludCA9IGNvbnRl" + + "eHQoKS5yZWFkRm9yd2FyZEZlZSgpOwovLy8gICAgIGxldCBvcmlnRmVlOiBJbnQgPSBnZXRPcmlnaW5hbEZ3ZEZlZShmZWUsIGZhbHNlKTsKLy8vIH0KLy8vIGBgYAov" + + "Ly8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0b3JpZ2luYWxmd2RmZWUKLy8vICogaHR0cHM6Ly9k" + + "b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0Zm9yd2FyZGZlZQovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1hZHZh" + + "bmNlZCNjb250ZXh0cmVhZGZvcndhcmRmZWUKLy8vCmFzbSBmdW4gZ2V0T3JpZ2luYWxGd2RGZWUoZndkRmVlOiBJbnQsIGlzTWFzdGVyY2hhaW46IEJvb2wpOiBJbnQg" + + "eyBHRVRPUklHSU5BTEZXREZFRSB9CgovLy8gU3RydWN0IHJlcHJlc2VudGluZyB0aGUgc3RhbmRhcmQgYWRkcmVzcyBvbiBUT04gQmxvY2tjaGFpbiB3aXRoIHNpZ25l" + + "ZCA4LWJpdCBgd29ya2NoYWluYCBJRCBhbmQgYW4gdW5zaWduZWQgMjU2LWJpdCBgYWRkcmVzc2AgaW4gdGhlIHNwZWNpZmllZCBgd29ya2NoYWluYC4gQXZhaWxhYmxl" + + "IHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8gQXQgdGhlIG1vbWVudCwgb25seSBgd29ya2NoYWluYCBJRHMgdXNlZCBvbiBUT04gYXJlIDAgb2YgdGhlIGJhc2VjaGFp" + + "biBhbmQgLTEgb2YgdGhlIG1hc3RlcmNoYWluLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjcGFy" + + "c2VzdGRhZGRyZXNzCi8vLyAqIGh0dHBzOi8vZ2l0aHViLmNvbS90b24tYmxvY2tjaGFpbi90b24vYmxvYi9tYXN0ZXIvY3J5cHRvL2Jsb2NrL2Jsb2NrLnRsYiNMMTA1" + + "LUwxMDYKLy8vCnN0cnVjdCBTdGRBZGRyZXNzIHsKICAgIHdvcmtjaGFpbjogSW50IGFzIGludDg7CiAgICBhZGRyZXNzOiBJbnQgYXMgdWludDI1NjsKfQoKLy8vIFN0" + + "cnVjdCByZXByZXNlbnRpbmcgdGhlIGFkZHJlc3Mgb2YgdmFyaWFibGUgbGVuZ3RoIHdpdGggc2lnbmVkIDMyLWJpdCBgd29ya2NoYWluYCBJRCBhbmQgYSBgU2xpY2Vg" + + "IGNvbnRhaW5pbmcgdW5zaWduZWQgYGFkZHJlc3NgIGluIHRoZSBzcGVjaWZpZWQgYHdvcmtjaGFpbmAuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgovLy8KLy8v" + + "IFZhcmlhYmxlLWxlbmd0aCBhZGRyZXNzZXMgYXJlIGludGVuZGVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucywgYW5kIHdoaWxlIHZhbGlkYXRvcnMgbXVzdCBiZSByZWFk" + + "eSB0byBhY2NlcHQgdGhlbSBpbiBpbmJvdW5kIG1lc3NhZ2VzLCB0aGUgc3RhbmRhcmQgKG5vbi12YXJpYWJsZSkgYWRkcmVzc2VzIGFyZSB1c2VkIHdoZW5ldmVyIHBv" + + "c3NpYmxlLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjcGFyc2V2YXJhZGRyZXNzCi8vLyAqIGh0" + + "dHBzOi8vZ2l0aHViLmNvbS90b24tYmxvY2tjaGFpbi90b24vYmxvYi9tYXN0ZXIvY3J5cHRvL2Jsb2NrL2Jsb2NrLnRsYiNMMTA3LUwxMDgKLy8vCnN0cnVjdCBWYXJB" + + "ZGRyZXNzIHsKICAgIHdvcmtjaGFpbjogSW50IGFzIGludDMyOwogICAgYWRkcmVzczogU2xpY2U7Cn0KCi8vLyBBc3NlbWJseSBmdW5jdGlvbi4gQXZhaWxhYmxlIHNp" + + "bmNlIFRhY3QgMS41LjAuCi8vLwovLy8gQ29udmVydHMgYSBgU2xpY2VgIGNvbnRhaW5pbmcgYW4gYWRkcmVzcyBpbnRvIHRoZSBgU3RkQWRkcmVzc2AgU3RydWN0IGFu" + + "ZCByZXR1cm5zIGl0LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBhZGRyID0gYWRkcmVzcygiRVFEdEZwRXdjRkFFY1JlNW1M" + + "VmgyTjZDMHgtX2hKRU03VzYxX0pMblNGNzRwNHEyIik7Ci8vLyAgICAgbGV0IHBhcnNlZEFkZHIgPSBwYXJzZVN0ZEFkZHJlc3MoYWRkci5hc1NsaWNlKCkpOwovLy8K" + + "Ly8vICAgICBwYXJzZWRBZGRyLndvcmtjaGFpbjsgLy8gMAovLy8gICAgIHBhcnNlZEFkZHIuYWRkcmVzczsgICAvLyAxMDcuLi4yODcKLy8vIH0KLy8vIGBgYAovLy8K" + + "Ly8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjcGFyc2VzdGRhZGRyZXNzCi8vLwphc20gZnVuIHBhcnNlU3RkQWRkcmVz" + + "cyhzbGljZTogU2xpY2UpOiBTdGRBZGRyZXNzIHsgUkVXUklURVNUREFERFIgfQoKLy8vIEFzc2VtYmx5IGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUu" + + "MC4KLy8vCi8vLyBDb252ZXJ0cyBhIGBTbGljZWAgY29udGFpbmluZyBhbiBhZGRyZXNzIG9mIHZhcmlhYmxlIGxlbmd0aCBpbnRvIHRoZSBgVmFyQWRkcmVzc2AgU3Ry" + + "dWN0IGFuZCByZXR1cm5zIGl0LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCB2YXJBZGRyU2xpY2UgPSBiZWdpbkNlbGwoKQov" + + "Ly8gICAgICAgICAuc3RvcmVVaW50KDYsIDMpICAgICAvLyB0byByZWNvZ25pemUgdGhlIGZvbGxvd2luZyBhcyBhIFZhckFkZHJlc3MKLy8vICAgICAgICAgLnN0b3Jl" + + "VWludCgxMjMsIDkpICAgLy8gbWFrZSBhZGRyZXNzIG9jY3VweSAxMjMgYml0cwovLy8gICAgICAgICAuc3RvcmVVaW50KDIzNCwgMzIpICAvLyBzcGVjaWZ5IHdvcmtj" + + "aGFpbiBJRCBvZiAyMzQKLy8vICAgICAgICAgLnN0b3JlVWludCgzNDUsIDEyMykgLy8gc3BlY2lmeSBhZGRyZXNzIG9mIDM0NQovLy8gICAgICAgICAuYXNTbGljZSgp" + + "OwovLy8gICAgIGxldCBwYXJzZWRWYXJBZGRyID0gcGFyc2VWYXJBZGRyZXNzKHZhckFkZHJTbGljZSk7Ci8vLwovLy8gICAgIHBhcnNlZFZhckFkZHIud29ya2NoYWlu" + + "OyAgICAgICAgICAgICAvLyAyMzQKLy8vICAgICBwYXJzZWRWYXJBZGRyLmFkZHJlc3M7ICAgICAgICAgICAgICAgLy8gQ1N7Q2VsbHswMDIuLi4yYjN9IGJpdHM6IDQ0" + + "Li4xNjc7IHJlZnM6IDAuLjB9Ci8vLyAgICAgcGFyc2VkVmFyQWRkci5hZGRyZXNzLmxvYWRVaW50KDEyMyk7IC8vIDM0NQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2Vl" + + "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1hZHZhbmNlZCNwYXJzZXZhcmFkZHJlc3MKLy8vCmFzbSBmdW4gcGFyc2VWYXJBZGRyZXNzKHNsaWNl" + + "OiBTbGljZSk6IFZhckFkZHJlc3MgeyBSRVdSSVRFVkFSQUREUiB9Cg=="; +files["std/crypto.tact"] = + "YXNtIGV4dGVuZHMgZnVuIGhhc2goc2VsZjogQ2VsbCk6IEludCB7IEhBU0hDVSB9Cgphc20gZXh0ZW5kcyBmdW4gaGFzaChzZWxmOiBTbGljZSk6IEludCB7IEhBU0hT" + + "VSB9Cgphc20gZnVuIGNoZWNrU2lnbmF0dXJlKGhhc2g6IEludCwgc2lnbmF0dXJlOiBTbGljZSwgcHVibGljX2tleTogSW50KTogQm9vbCB7IENIS1NJR05VIH0KCmFz" + + "bSBmdW4gY2hlY2tEYXRhU2lnbmF0dXJlKGRhdGE6IFNsaWNlLCBzaWduYXR1cmU6IFNsaWNlLCBwdWJsaWNfa2V5OiBJbnQpOiBCb29sIHsgQ0hLU0lHTlMgfQo="; +files["std/debug.tact"] = + "Ly8gdGhlc2UgYXJlIGJ1aWx0aW4gZnVuY3Rpb25zLCB0aGVzZSBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgZnJvbSBGdW5DCi8vIGhlbmNlLCBubyBhc20gaGVyZQoKQG5h" + + "bWUodGhyb3cpCm5hdGl2ZSBuYXRpdmVUaHJvdyhjb2RlOiBJbnQpOwoKQG5hbWUodGhyb3dfaWYpCm5hdGl2ZSBuYXRpdmVUaHJvd0lmKGNvZGU6IEludCwgY29uZGl0" + + "aW9uOiBCb29sKTsKCkBuYW1lKHRocm93KQpuYXRpdmUgdGhyb3coY29kZTogSW50KTsKCkBuYW1lKHRocm93X3VubGVzcykKbmF0aXZlIG5hdGl2ZVRocm93VW5sZXNz" + + "KGNvZGU6IEludCwgY29uZGl0aW9uOiBCb29sKTs="; +files["std/math.tact"] = + "Ly8gUHJlcGFyZSByYW5kb20KCi8vIE1peGVzIHVuc2lnbmVkIDI1Ni1iaXQgaW50ZWdlciB4IGludG8gdGhlIHJhbmRvbSBzZWVkIHIgYnkgc2V0dGluZyB0aGUgcmFu" + + "ZG9tIHNlZWQKLy8gdG8gc2hhMjU2IG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIHR3byAzMi1ieXRlIHN0cmluZ3M6Ci8vIHRoZSBmaXJzdCB3aXRoIHRoZSBiaWctZW5k" + + "aWFuIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvbGQgc2VlZCByLCBhbmQKLy8gdGhlIHNlY29uZCB3aXRoIHRoZSBiaWctZW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHgu" + + "CmFzbSBmdW4gbmF0aXZlUmFuZG9taXplKHg6IEludCkgeyBBRERSQU5EIH0KCi8vLyBFcXVpdmFsZW50IHRvIGBuYXRpdmVSYW5kb21pemUoY3VyX2x0KCkpYCwKLy8v" + + "IHdoZXJlIGBjdXJfbHQoKWAgaXMgdGhlIGxvZ2ljYWwgdGltZSBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgphc20gZnVuIG5hdGl2ZVJhbmRvbWl6ZUx0KCkgeyBM" + + "VElNRSBBRERSQU5EIH0KCkBuYW1lKF9fdGFjdF9wcmVwYXJlX3JhbmRvbSkKbmF0aXZlIG5hdGl2ZVByZXBhcmVSYW5kb20oKTsKCi8vIFJhbmRvbQoKLy8gR2VuZXJh" + + "dGVzIGEgbmV3IHBzZXVkby1yYW5kb20gdW5zaWduZWQgMjU2LWJpdCBpbnRlZ2VyIHguCi8vIFRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czogaWYgciBpcyB0aGUg" + + "b2xkIHZhbHVlIG9mIHRoZSByYW5kb20gc2VlZCwKLy8gY29uc2lkZXJlZCBhcyBhIDMyLWJ5dGUgYXJyYXkgKGJ5IGNvbnN0cnVjdGluZyB0aGUgYmlnLWVuZGlhbiBy" + + "ZXByZXNlbnRhdGlvbgovLyBvZiBhbiB1bnNpZ25lZCAyNTYtYml0IGludGVnZXIpLCB0aGVuIGl0cyBzaGE1MTIocikgaXMgY29tcHV0ZWQ7Ci8vIHRoZSBmaXJzdCAz" + + "MiBieXRlcyBvZiB0aGlzIGhhc2ggYXJlIHN0b3JlZCBhcyB0aGUgbmV3IHZhbHVlIHInIG9mIHRoZSByYW5kb20gc2VlZCwKLy8gYW5kIHRoZSByZW1haW5pbmcgMzIg" + + "Ynl0ZXMgYXJlIHJldHVybmVkIGFzIHRoZSBuZXh0IHJhbmRvbSB2YWx1ZSB4Lgphc20gZnVuIG5hdGl2ZVJhbmRvbSgpOiBJbnQgeyBSQU5EVTI1NiB9CgovLyBHZW5l" + + "cmF0ZXMgYSBuZXcgcHNldWRvLXJhbmRvbSBpbnRlZ2VyIHogaW4gdGhlIHJhbmdlIDAuLnJhbmdl4oiSMQovLyAob3IgcmFuZ2UuLuKIkjEsIGlmIHJhbmdlIDwgMCku" + + "Ci8vIE1vcmUgcHJlY2lzZWx5LCBhbiB1bnNpZ25lZCByYW5kb20gdmFsdWUgeCBpcyBnZW5lcmF0ZWQgYXMgaW4gYG5hdGl2ZVJhbmRvbWA7Ci8vIHRoZW4geiA6PSB4" + + "ICogcmFuZ2UgLyAyXjI1NiBpcyBjb21wdXRlZC4KYXNtIGZ1biBuYXRpdmVSYW5kb21JbnRlcnZhbChtYXg6IEludCk6IEludCB7IFJBTkQgfQoKaW5saW5lIGZ1biBy" + + "YW5kb21JbnQoKTogSW50IHsKICAgIG5hdGl2ZVByZXBhcmVSYW5kb20oKTsKICAgIHJldHVybiBuYXRpdmVSYW5kb20oKTsKfQoKaW5saW5lIGZ1biByYW5kb20obWlu" + + "OiBJbnQsIG1heDogSW50KTogSW50IHsKICAgIG5hdGl2ZVByZXBhcmVSYW5kb20oKTsKICAgIHJldHVybiBtaW4gKyBuYXRpdmVSYW5kb21JbnRlcnZhbChtYXggLSBt" + + "aW4pOwp9CgovLyBNYXRoCgphc20gZnVuIG1pbih4OiBJbnQsIHk6IEludCk6IEludCB7IE1JTiB9Cgphc20gZnVuIG1heCh4OiBJbnQsIHk6IEludCk6IEludCB7IE1B" + + "WCB9Cgphc20gZnVuIGFicyh4OiBJbnQpOiBJbnQgeyBBQlMgfQoKYXNtIGZ1biBub3coKTogSW50IHsgTk9XIH0KCmFzbSBmdW4gbG9nMihudW06IEludCk6IEludCB7" + + "CiAgICBEVVAgNSBUSFJPV0lGTk9UIFVCSVRTSVpFIERFQwp9CgpAbmFtZShfX3RhY3RfbG9nKQpuYXRpdmUgbG9nKG51bTogSW50LCBiYXNlOiBJbnQpOiBJbnQ7CgpA" + + "bmFtZShfX3RhY3RfcG93KQpuYXRpdmUgcG93KGJhc2U6IEludCwgZXhwOiBJbnQpOiBJbnQ7Cgphc20gZnVuIHBvdzIoZXhwOiBJbnQpOiBJbnQgeyBQT1cyIH0="; +files["std/primitives.tact"] = + "cHJpbWl0aXZlIEludDsKcHJpbWl0aXZlIEJvb2w7CnByaW1pdGl2ZSBCdWlsZGVyOwpwcmltaXRpdmUgU2xpY2U7CnByaW1pdGl2ZSBDZWxsOwpwcmltaXRpdmUgQWRk" + + "cmVzczsKcHJpbWl0aXZlIFN0cmluZzsKcHJpbWl0aXZlIFN0cmluZ0J1aWxkZXI7"; +files["std/reserve.tact"] = + "YXNtIGZ1biBuYXRpdmVSZXNlcnZlKGFtb3VudDogSW50LCBtb2RlOiBJbnQpIHsgUkFXUkVTRVJWRSB9Cgpjb25zdCBSZXNlcnZlRXhhY3Q6IEludCA9IDA7CmNvbnN0" + + "IFJlc2VydmVBbGxFeGNlcHQ6IEludCA9IDE7CmNvbnN0IFJlc2VydmVBdE1vc3Q6IEludCA9IDI7CmNvbnN0IFJlc2VydmVBZGRPcmlnaW5hbEJhbGFuY2U6IEludCA9" + + "IDQ7CmNvbnN0IFJlc2VydmVJbnZlcnRTaWduOiBJbnQgPSA4Owpjb25zdCBSZXNlcnZlQm91bmNlSWZBY3Rpb25GYWlsOiBJbnQgPSAxNjs="; +files["std/send.tact"] = + "YXNtIGZ1biBuYXRpdmVTZW5kTWVzc2FnZShjZWxsOiBDZWxsLCBtb2RlOiBJbnQpIHsgU0VORFJBV01TRyB9Cgphc20gZnVuIG5hdGl2ZVNlbmRNZXNzYWdlUmV0dXJu" + + "Rm9yd2FyZEZlZShtc2c6IENlbGwsIG1vZGU6IEludCk6IEludCB7IFNFTkRNU0cgfQoKY29uc3QgU2VuZFJlbWFpbmluZ0JhbGFuY2U6IEludCA9IDEyODsKY29uc3Qg" + + "U2VuZFJlbWFpbmluZ1ZhbHVlOiBJbnQgPSA2NDsKY29uc3QgU2VuZERlZmF1bHRNb2RlOiBJbnQgPSAwOwpjb25zdCBTZW5kSWdub3JlRXJyb3JzOiBJbnQgPSAyOwpj" + + "b25zdCBTZW5kUGF5R2FzU2VwYXJhdGVseTogSW50ID0gMTsKY29uc3QgU2VuZERlc3Ryb3lJZlplcm86IEludCA9IDMyOwpjb25zdCBTZW5kQm91bmNlSWZBY3Rpb25G" + + "YWlsOiBJbnQgPSAxNjsKY29uc3QgU2VuZE9ubHlFc3RpbWF0ZUZlZTogSW50ID0gMTAyNDsKCnN0cnVjdCBTZW5kUGFyYW1ldGVycyB7CiAgICBib3VuY2U6IEJvb2wg" + + "PSB0cnVlOwogICAgdG86IEFkZHJlc3M7CiAgICB2YWx1ZTogSW50OwogICAgbW9kZTogSW50ID0gMDsKICAgIGJvZHk6IENlbGw/ID0gbnVsbDsKICAgIGNvZGU6IENl" + + "bGw/ID0gbnVsbDsKICAgIGRhdGE6IENlbGw/ID0gbnVsbDsKfQoKZnVuIHNlbmQocGFyYW1zOiBTZW5kUGFyYW1ldGVycyk6IEludCB7IC8vIHJldHVybnMgZm9yd2Fy" + + "ZCBmZWUKICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7CiAgICBiID0gYi5zdG9yZUludCgxLCAyKTsgLy8gaW50ZXJuYWxfbWVzc2FnZSArIGloZF9kaXNh" + + "YmxlZAogICAgYiA9IGIuc3RvcmVCb29sKHBhcmFtcy5ib3VuY2UpOyAvLyBib3VuY2UKICAgIGIgPSBiLnN0b3JlSW50KDAsIDMpOyAvLyBib3VuY2VkICsgZnJvbQog" + + "ICAgYiA9IGIuc3RvcmVBZGRyZXNzKHBhcmFtcy50byk7IC8vIFRvCiAgICBiID0gYi5zdG9yZUNvaW5zKHBhcmFtcy52YWx1ZSk7IC8vIFZhbHVlCiAgICBiID0gYi5z" + + "dG9yZUludCgwLCAxICsgNCArIDQgKyA2NCArIDMyKTsgLy8gY3VycmVuY3lfY29sbGVjdGlvbiArIElIUiBmZWVzICsgRndkIGZlZXMgKyBDcmVhdGVkTFQgKyBDcmVh" + + "dGVkQXQKCiAgICAvLyBTdGF0ZWluaXQKICAgIGlmIChwYXJhbXMuY29kZSAhPSBudWxsIHx8IHBhcmFtcy5kYXRhICE9IG51bGwpIHsKICAgICAgICBiID0gYi5zdG9y" + + "ZUJvb2wodHJ1ZSk7IC8vIFN0YXRlIGluaXQKCiAgICAgICAgLy8gQXNzZW1ibGUgc3RhdGUgaW5pdCBjZWxsCiAgICAgICAgbGV0IGJjOiBCdWlsZGVyID0gYmVnaW5D" + + "ZWxsKCk7CiAgICAgICAgYmMgPSBiYy5zdG9yZUJvb2woZmFsc2UpOyAvLyBTcGxpdERlcHRoCiAgICAgICAgYmMgPSBiYy5zdG9yZUJvb2woZmFsc2UpOyAvLyBUaWNr" + + "VG9jawogICAgICAgIGlmIChwYXJhbXMuY29kZSAhPSBudWxsKSB7CiAgICAgICAgICAgIGJjID0gYmMuc3RvcmVCb29sKHRydWUpOyAvLyBDb2RlIHByZXNlbmNlCiAg" + + "ICAgICAgICAgIGJjID0gYmMuc3RvcmVSZWYocGFyYW1zLmNvZGUhISk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmMgPSBiYy5zdG9yZUJvb2woZmFsc2Up" + + "OyAvLyBDb2RlIHByZXNlbmNlCiAgICAgICAgfQogICAgICAgIGlmIChwYXJhbXMuZGF0YSAhPSBudWxsKSB7CiAgICAgICAgICAgIGJjID0gYmMuc3RvcmVCb29sKHRy" + + "dWUpOyAvLyBEYXRhIHByZXNlbmNlCiAgICAgICAgICAgIGJjID0gYmMuc3RvcmVSZWYocGFyYW1zLmRhdGEhISk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg" + + "YmMgPSBiYy5zdG9yZUJvb2woZmFsc2UpOyAvLyBEYXRhIHByZXNlbmNlCiAgICAgICAgfQogICAgICAgIGJjID0gYmMuc3RvcmVCb29sKGZhbHNlKTsgLy8gTGlicmFy" + + "eQoKICAgICAgICBiID0gYi5zdG9yZUJvb2wodHJ1ZSk7IC8vIFN0b3JlIGFzIHJlZgogICAgICAgIGIgPSBiLnN0b3JlUmVmKGJjLmVuZENlbGwoKSk7CiAgICB9IGVs" + + "c2UgewogICAgICAgIGIgPSBiLnN0b3JlQm9vbChmYWxzZSk7IC8vIE5vIHN0YXRlIGluaXQKICAgIH0KCiAgICAvLyBCb2R5CiAgICBsZXQgYm9keTogQ2VsbD8gPSBw" + + "YXJhbXMuYm9keTsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgICBiID0gYi5zdG9yZUJvb2wodHJ1ZSk7CiAgICAgICAgYiA9IGIuc3RvcmVSZWYoYm9keSEh" + + "KTsKICAgIH0gZWxzZSB7CiAgICAgICAgYiA9IGIuc3RvcmVCb29sKGZhbHNlKTsgLy8gTm8gYm9keQogICAgfQoKICAgIC8vIFNlbmQKICAgIGxldCBjOiBDZWxsID0g" + + "Yi5lbmRDZWxsKCk7CiAgICByZXR1cm4gbmF0aXZlU2VuZE1lc3NhZ2VSZXR1cm5Gb3J3YXJkRmVlKGMsIHBhcmFtcy5tb2RlKTsKfQoKaW5saW5lIGZ1biBlbWl0KGJv" + + "ZHk6IENlbGwpIHsKICAgIC8vIGV4dF9vdXRfbXNnX2luZm8kMTEgc3JjOk1zZ0FkZHJlc3NJbnQgZGVzdDpNc2dBZGRyZXNzRXh0IGNyZWF0ZWRfbHQ6dWludDY0IGNy" + + "ZWF0ZWRfYXQ6dWludDMyCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIG1heWJlOiBzdGF0ZUluaXQgKGZhbHNlKSBib2R5UmVmOiBib29sICh0cnVlKQogICAgbGV0" + + "IGM6IENlbGwgPSBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVVpbnQoMTUyMTE4MDcyMDI3Mzg3NTI4MTc5NjA0Mzg0NjQ1MTMsIDEwNCkKICAgICAgICAuc3RvcmVS" + + "ZWYoYm9keSkKICAgICAgICAuZW5kQ2VsbCgpOwogICAgbmF0aXZlU2VuZE1lc3NhZ2UoYywgMCk7Cn0KCmFzbSBmdW4gYWNjZXB0TWVzc2FnZSgpIHsgQUNDRVBUIH0K" + + "CmFzbSBmdW4gY29tbWl0KCkgeyBDT01NSVQgfQo="; +files["std/text.tact"] = + "Ly8KLy8gU3RyaW5nIGJ1aWxkZXIKLy8KCkBuYW1lKF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9zdGFydF9zdHJpbmcpCm5hdGl2ZSBiZWdpblN0cmluZygpOiBTdHJpbmdC" + + "dWlsZGVyOwoKQG5hbWUoX190YWN0X3N0cmluZ19idWlsZGVyX3N0YXJ0X2NvbW1lbnQpCm5hdGl2ZSBiZWdpbkNvbW1lbnQoKTogU3RyaW5nQnVpbGRlcjsKCkBuYW1l" + + "KF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9zdGFydF90YWlsX3N0cmluZykKbmF0aXZlIGJlZ2luVGFpbFN0cmluZygpOiBTdHJpbmdCdWlsZGVyOwoKQG5hbWUoX190YWN0" + + "X3N0cmluZ19idWlsZGVyX3N0YXJ0KQpuYXRpdmUgYmVnaW5TdHJpbmdGcm9tQnVpbGRlcihiOiBCdWlsZGVyKTogU3RyaW5nQnVpbGRlcjsKCkBuYW1lKF9fdGFjdF9z" + + "dHJpbmdfYnVpbGRlcl9hcHBlbmQpCmV4dGVuZHMgbXV0YXRlcyBuYXRpdmUgYXBwZW5kKHNlbGY6IFN0cmluZ0J1aWxkZXIsIHM6IFN0cmluZyk7CgpAbmFtZShfX3Rh" + + "Y3Rfc3RyaW5nX2J1aWxkZXJfYXBwZW5kX25vdF9tdXQpCmV4dGVuZHMgbmF0aXZlIGNvbmNhdChzZWxmOiBTdHJpbmdCdWlsZGVyLCBzOiBTdHJpbmcpOiBTdHJpbmdC" + + "dWlsZGVyOwoKQG5hbWUoX190YWN0X3N0cmluZ19idWlsZGVyX2VuZCkKZXh0ZW5kcyBuYXRpdmUgdG9DZWxsKHNlbGY6IFN0cmluZ0J1aWxkZXIpOiBDZWxsOwoKQG5h" + + "bWUoX190YWN0X3N0cmluZ19idWlsZGVyX2VuZF9zbGljZSkKZXh0ZW5kcyBuYXRpdmUgdG9TdHJpbmcoc2VsZjogU3RyaW5nQnVpbGRlcik6IFN0cmluZzsKCkBuYW1l" + + "KF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9lbmRfc2xpY2UpCmV4dGVuZHMgbmF0aXZlIHRvU2xpY2Uoc2VsZjogU3RyaW5nQnVpbGRlcik6IFNsaWNlOwoKLy8KLy8gU3Ry" + + "aW5nIGNvbnZlcnNpb24KLy8KCkBuYW1lKF9fdGFjdF9pbnRfdG9fc3RyaW5nKQpleHRlbmRzIG5hdGl2ZSB0b1N0cmluZyhzZWxmOiBJbnQpOiBTdHJpbmc7CgpAbmFt" + + "ZShfX3RhY3RfZmxvYXRfdG9fc3RyaW5nKQpleHRlbmRzIG5hdGl2ZSB0b0Zsb2F0U3RyaW5nKHNlbGY6IEludCwgZGlnaXRzOiBJbnQpOiBTdHJpbmc7CgppbmxpbmUg" + + "ZXh0ZW5kcyBmdW4gdG9Db2luc1N0cmluZyhzZWxmOiBJbnQpOiBTdHJpbmcgewogICAgcmV0dXJuIHNlbGYudG9GbG9hdFN0cmluZyg5KTsKfQoKZXh0ZW5kcyBmdW4g" + + "YXNDb21tZW50KHNlbGY6IFN0cmluZyk6IENlbGwgewogICAgbGV0IGI6IFN0cmluZ0J1aWxkZXIgPSBiZWdpbkNvbW1lbnQoKTsKICAgIGIuYXBwZW5kKHNlbGYpOwog" + + "ICAgcmV0dXJuIGIudG9DZWxsKCk7Cn0KCkBuYW1lKF9fdGFjdF9zdHJfdG9fc2xpY2UpCmV4dGVuZHMgbmF0aXZlIGFzU2xpY2Uoc2VsZjogU3RyaW5nKTogU2xpY2U7" + + "CgpAbmFtZShfX3RhY3Rfc2xpY2VfdG9fc3RyKQpleHRlbmRzIG5hdGl2ZSBhc1N0cmluZyhzZWxmOiBTbGljZSk6IFN0cmluZzsKCmlubGluZSBleHRlbmRzIGZ1biBm" + + "cm9tQmFzZTY0KHNlbGY6IFN0cmluZyk6IFNsaWNlIHsKICAgIHJldHVybiBzZWxmLmFzU2xpY2UoKS5mcm9tQmFzZTY0KCk7Cn0KCmV4dGVuZHMgZnVuIGZyb21CYXNl" + + "NjQoc2VsZjogU2xpY2UpOiBTbGljZSB7CiAgICBsZXQgc2l6ZTogSW50ID0gc2VsZi5iaXRzKCkgLyA4OwogICAgbGV0IHJlc3VsdDogQnVpbGRlciA9IGJlZ2luQ2Vs" + + "bCgpOwoKICAgIHJlcGVhdCAoc2l6ZSkgewogICAgICAgIGxldCBjb2RlOiBJbnQgPSBzZWxmLmxvYWRVaW50KDgpOwogICAgICAgIGlmIChjb2RlID49IDY1ICYmIGNv" + + "ZGUgPD0gOTApIHsgLy8gQS1aCiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdG9yZVVpbnQoY29kZSAtIDY1LCA2KTsKICAgICAgICB9IGVsc2UgaWYgKGNvZGUg" + + "Pj0gOTcgJiYgY29kZSA8PSAxMjIpIHsgLy8gYS16CiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdG9yZVVpbnQoY29kZSAtICg5NyAtIDI2KSwgNik7CiAgICAg" + + "ICAgfSBlbHNlIGlmIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHsgLy8gMC05CiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdG9yZVVpbnQoY29kZSArICg1" + + "MiAtIDQ4KSwgNik7CiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IDQ1IHx8IGNvZGUgPT0gNDMpIHsgLy8gLSBvciArCiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3Vs" + + "dC5zdG9yZVVpbnQoNjIsIDYpOwogICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSA5NSB8fCBjb2RlID09IDQ3KSB7IC8vIF8gb3IgLwogICAgICAgICAgICByZXN1bHQg" + + "PSByZXN1bHQuc3RvcmVVaW50KDYzLCA2KTsKICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gNjEpIHsgLy8gPQogICAgICAgICAgICAvLyBTa2lwCiAgICAgICAgfSBl" + + "bHNlIHsKICAgICAgICAgICAgdGhyb3coMTM0KTsKICAgICAgICB9CiAgICB9CgogICAgLy8gUGFkZGluZwogICAgbGV0IHRvdGFsOiBJbnQgPSByZXN1bHQuYml0cygp" + + "OwogICAgbGV0IHBhZGRpbmc6IEludCA9IHRvdGFsICUgODsKICAgIGlmIChwYWRkaW5nICE9IDApIHsKICAgICAgICBsZXQgczogU2xpY2UgPSByZXN1bHQuYXNTbGlj" + + "ZSgpOwogICAgICAgIHJldHVybiBzLmxvYWRCaXRzKHRvdGFsIC0gcGFkZGluZyk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiByZXN1bHQuYXNTbGljZSgpOwog" + + "ICAgfQp9CgovLwovLyBBZGRyZXNzIGNvbnZlcnNpb24KLy8KCkBuYW1lKF9fdGFjdF9hZGRyZXNzX3RvX3VzZXJfZnJpZW5kbHkpCmV4dGVuZHMgbmF0aXZlIHRvU3Ry" + + "aW5nKHNlbGY6IEFkZHJlc3MpOiBTdHJpbmc7"; +files["stdlib_ex.fc"] = + "Zm9yYWxsIFggLT4gdHVwbGUgX190YWN0X3NldCh0dXBsZSB4LCBYIHYsIGludCBpKSBhc20gIlNFVElOREVYVkFSUSI7CigpIF9fdGFjdF9ub3AoKSBhc20gIk5PUCI7" + + "CnNsaWNlIF9fdGFjdF9zdHJfdG9fc2xpY2Uoc2xpY2UgcykgYXNtICJOT1AiOwpzbGljZSBfX3RhY3Rfc2xpY2VfdG9fc3RyKHNsaWNlIHMpIGFzbSAiTk9QIjsKc2xp" + + "Y2UgX190YWN0X2FkZHJlc3NfdG9fc2xpY2Uoc2xpY2UgcykgYXNtICJOT1AiOw=="; +files["stdlib.fc"] = + "OzsgU3RhbmRhcmQgbGlicmFyeSBmb3IgZnVuQwo7OwoKey0KICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFRPTiBGdW5DIFN0YW5kYXJkIExpYnJhcnkuCgogICAgRnVu" + + "QyBTdGFuZGFyZCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJt" + + "cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0" + + "aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgRnVuQyBTdGFuZGFyZCBMaWJy" + + "YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl" + + "biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAg" + + "R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgotfQoKey0KICAjIFR1cGxlIG1hbmlwdWxhdGlvbiBwcmltaXRpdmVzCiAg" + + "VGhlIG5hbWVzIGFuZCB0aGUgdHlwZXMgYXJlIG1vc3RseSBzZWxmLWV4cGxhaW5pbmcuCiAgU2VlIFtwb2x5bW9yaGlzbSB3aXRoIGZvcmFsbF0oaHR0cHM6Ly90b24u" + + "b3JnL2RvY3MvIy9mdW5jL2Z1bmN0aW9ucz9pZD1wb2x5bW9ycGhpc20td2l0aC1mb3JhbGwpCiAgZm9yIG1vcmUgaW5mbyBvbiB0aGUgcG9seW1vcnBoaWMgZnVuY3Rp" + + "b25zLgoKICBOb3RlIHRoYXQgY3VycmVudGx5IHZhbHVlcyBvZiBhdG9taWMgdHlwZSBgdHVwbGVgIGNhbid0IGJlIGNhc3QgdG8gY29tcG9zaXRlIHR1cGxlIHR5cGUg" + + "KGUuZy4gYFtpbnQsIGNlbGxdYCkKICBhbmQgdmlzZSB2ZXJzYS4KLX0KCnstCiAgIyBMaXNwLXN0eWxlIGxpc3RzCgogIExpc3RzIGNhbiBiZSByZXByZXNlbnRlZCBh" + + "cyBuZXN0ZWQgMi1lbGVtZW50cyB0dXBsZXMuCiAgRW1wdHkgbGlzdCBpcyBjb252ZW50aW9uYWxseSByZXByZXNlbnRlZCBhcyBUVk0gYG51bGxgIHZhbHVlIChpdCBj" + + "YW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyBbbnVsbCgpXSkuCiAgRm9yIGV4YW1wbGUsIHR1cGxlIGAoMSwgKDIsICgzLCBudWxsKSkpYCByZXByZXNlbnRzIGxpc3Qg" + + "YFsxLCAyLCAzXWAuIEVsZW1lbnRzIG9mIGEgbGlzdCBjYW4gYmUgb2YgZGlmZmVyZW50IHR5cGVzLgotfQoKOzs7IEFkZHMgYW4gZWxlbWVudCB0byB0aGUgYmVnaW5u" + + "aW5nIG9mIGxpc3Atc3R5bGUgbGlzdC4KZm9yYWxsIFggLT4gdHVwbGUgY29ucyhYIGhlYWQsIHR1cGxlIHRhaWwpIGFzbSAiQ09OUyI7Cgo7OzsgRXh0cmFjdHMgdGhl" + + "IGhlYWQgYW5kIHRoZSB0YWlsIG9mIGxpc3Atc3R5bGUgbGlzdC4KZm9yYWxsIFggLT4gKFgsIHR1cGxlKSB1bmNvbnModHVwbGUgbGlzdCkgYXNtICJVTkNPTlMiOwoK" + + "Ozs7IEV4dHJhY3RzIHRoZSB0YWlsIGFuZCB0aGUgaGVhZCBvZiBsaXNwLXN0eWxlIGxpc3QuCmZvcmFsbCBYIC0+ICh0dXBsZSwgWCkgbGlzdF9uZXh0KHR1cGxlIGxp" + + "c3QpIGFzbSgtPiAxIDApICJVTkNPTlMiOwoKOzs7IFJldHVybnMgdGhlIGhlYWQgb2YgbGlzcC1zdHlsZSBsaXN0Lgpmb3JhbGwgWCAtPiBYIGNhcih0dXBsZSBsaXN0" + + "KSBhc20gIkNBUiI7Cgo7OzsgUmV0dXJucyB0aGUgdGFpbCBvZiBsaXNwLXN0eWxlIGxpc3QuCnR1cGxlIGNkcih0dXBsZSBsaXN0KSBhc20gIkNEUiI7Cgo7OzsgQ3Jl" + + "YXRlcyB0dXBsZSB3aXRoIHplcm8gZWxlbWVudHMuCnR1cGxlIGVtcHR5X3R1cGxlKCkgYXNtICJOSUwiOwoKOzs7IEFwcGVuZHMgYSB2YWx1ZSBgeGAgdG8gYSBgVHVw" + + "bGUgdCA9ICh4MSwgLi4uLCB4bilgLCBidXQgb25seSBpZiB0aGUgcmVzdWx0aW5nIGBUdXBsZSB0JyA9ICh4MSwgLi4uLCB4biwgeClgCjs7OyBpcyBvZiBsZW5ndGgg" + + "YXQgbW9zdCAyNTUuIE90aGVyd2lzZSB0aHJvd3MgYSB0eXBlIGNoZWNrIGV4Y2VwdGlvbi4KZm9yYWxsIFggLT4gdHVwbGUgdHB1c2godHVwbGUgdCwgWCB2YWx1ZSkg" + + "YXNtICJUUFVTSCI7CmZvcmFsbCBYIC0+ICh0dXBsZSwgKCkpIH50cHVzaCh0dXBsZSB0LCBYIHZhbHVlKSBhc20gIlRQVVNIIjsKCjs7OyBDcmVhdGVzIGEgdHVwbGUg" + + "b2YgbGVuZ3RoIG9uZSB3aXRoIGdpdmVuIGFyZ3VtZW50IGFzIGVsZW1lbnQuCmZvcmFsbCBYIC0+IFtYXSBzaW5nbGUoWCB4KSBhc20gIlNJTkdMRSI7Cgo7OzsgVW5w" + + "YWNrcyBhIHR1cGxlIG9mIGxlbmd0aCBvbmUKZm9yYWxsIFggLT4gWCB1bnNpbmdsZShbWF0gdCkgYXNtICJVTlNJTkdMRSI7Cgo7OzsgQ3JlYXRlcyBhIHR1cGxlIG9m" + + "IGxlbmd0aCB0d28gd2l0aCBnaXZlbiBhcmd1bWVudHMgYXMgZWxlbWVudHMuCmZvcmFsbCBYLCBZIC0+IFtYLCBZXSBwYWlyKFggeCwgWSB5KSBhc20gIlBBSVIiOwoK" + + "Ozs7IFVucGFja3MgYSB0dXBsZSBvZiBsZW5ndGggdHdvCmZvcmFsbCBYLCBZIC0+IChYLCBZKSB1bnBhaXIoW1gsIFldIHQpIGFzbSAiVU5QQUlSIjsKCjs7OyBDcmVh" + + "dGVzIGEgdHVwbGUgb2YgbGVuZ3RoIHRocmVlIHdpdGggZ2l2ZW4gYXJndW1lbnRzIGFzIGVsZW1lbnRzLgpmb3JhbGwgWCwgWSwgWiAtPiBbWCwgWSwgWl0gdHJpcGxl" + + "KFggeCwgWSB5LCBaIHopIGFzbSAiVFJJUExFIjsKCjs7OyBVbnBhY2tzIGEgdHVwbGUgb2YgbGVuZ3RoIHRocmVlCmZvcmFsbCBYLCBZLCBaIC0+IChYLCBZLCBaKSB1" + + "bnRyaXBsZShbWCwgWSwgWl0gdCkgYXNtICJVTlRSSVBMRSI7Cgo7OzsgQ3JlYXRlcyBhIHR1cGxlIG9mIGxlbmd0aCBmb3VyIHdpdGggZ2l2ZW4gYXJndW1lbnRzIGFz" + + "IGVsZW1lbnRzLgpmb3JhbGwgWCwgWSwgWiwgVyAtPiBbWCwgWSwgWiwgV10gdHVwbGU0KFggeCwgWSB5LCBaIHosIFcgdykgYXNtICI0IFRVUExFIjsKCjs7OyBVbnBh" + + "Y2tzIGEgdHVwbGUgb2YgbGVuZ3RoIGZvdXIKZm9yYWxsIFgsIFksIFosIFcgLT4gKFgsIFksIFosIFcpIHVudHVwbGU0KFtYLCBZLCBaLCBXXSB0KSBhc20gIjQgVU5U" + + "VVBMRSI7Cgo7OzsgUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHR1cGxlICh3aXRoIHVua25vd24gZWxlbWVudCB0eXBlcykuCmZvcmFsbCBYIC0+IFggZmly" + + "c3QodHVwbGUgdCkgYXNtICJGSVJTVCI7Cgo7OzsgUmV0dXJucyB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgYSB0dXBsZSAod2l0aCB1bmtub3duIGVsZW1lbnQgdHlwZXMp" + + "Lgpmb3JhbGwgWCAtPiBYIHNlY29uZCh0dXBsZSB0KSBhc20gIlNFQ09ORCI7Cgo7OzsgUmV0dXJucyB0aGUgdGhpcmQgZWxlbWVudCBvZiBhIHR1cGxlICh3aXRoIHVu" + + "a25vd24gZWxlbWVudCB0eXBlcykuCmZvcmFsbCBYIC0+IFggdGhpcmQodHVwbGUgdCkgYXNtICJUSElSRCI7Cgo7OzsgUmV0dXJucyB0aGUgZm91cnRoIGVsZW1lbnQg" + + "b2YgYSB0dXBsZSAod2l0aCB1bmtub3duIGVsZW1lbnQgdHlwZXMpLgpmb3JhbGwgWCAtPiBYIGZvdXJ0aCh0dXBsZSB0KSBhc20gIjMgSU5ERVgiOwoKOzs7IFJldHVy" + + "bnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBwYWlyIHR1cGxlLgpmb3JhbGwgWCwgWSAtPiBYIHBhaXJfZmlyc3QoW1gsIFldIHApIGFzbSAiRklSU1QiOwoKOzs7IFJl" + + "dHVybnMgdGhlIHNlY29uZCBlbGVtZW50IG9mIGEgcGFpciB0dXBsZS4KZm9yYWxsIFgsIFkgLT4gWSBwYWlyX3NlY29uZChbWCwgWV0gcCkgYXNtICJTRUNPTkQiOwoK" + + "Ozs7IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSB0cmlwbGUgdHVwbGUuCmZvcmFsbCBYLCBZLCBaIC0+IFggdHJpcGxlX2ZpcnN0KFtYLCBZLCBaXSBwKSBh" + + "c20gIkZJUlNUIjsKCjs7OyBSZXR1cm5zIHRoZSBzZWNvbmQgZWxlbWVudCBvZiBhIHRyaXBsZSB0dXBsZS4KZm9yYWxsIFgsIFksIFogLT4gWSB0cmlwbGVfc2Vjb25k" + + "KFtYLCBZLCBaXSBwKSBhc20gIlNFQ09ORCI7Cgo7OzsgUmV0dXJucyB0aGUgdGhpcmQgZWxlbWVudCBvZiBhIHRyaXBsZSB0dXBsZS4KZm9yYWxsIFgsIFksIFogLT4g" + + "WiB0cmlwbGVfdGhpcmQoW1gsIFksIFpdIHApIGFzbSAiVEhJUkQiOwoKCjs7OyBQdXNoIG51bGwgZWxlbWVudCAoY2FzdGVkIHRvIGdpdmVuIHR5cGUpCjs7OyBCeSB0" + + "aGUgVFZNIHR5cGUgYE51bGxgIEZ1bkMgcmVwcmVzZW50cyBhYnNlbmNlIG9mIGEgdmFsdWUgb2Ygc29tZSBhdG9taWMgdHlwZS4KOzs7IFNvIGBudWxsYCBjYW4gYWN0" + + "dWFsbHkgaGF2ZSBhbnkgYXRvbWljIHR5cGUuCmZvcmFsbCBYIC0+IFggbnVsbCgpIGFzbSAiUFVTSE5VTEwiOwoKOzs7IE1vdmVzIGEgdmFyaWFibGUgW3hdIHRvIHRo" + + "ZSB0b3Agb2YgdGhlIHN0YWNrCmZvcmFsbCBYIC0+IChYLCAoKSkgfmltcHVyZV90b3VjaChYIHgpIGltcHVyZSBhc20gIk5PUCI7CgoKCjs7OyBSZXR1cm5zIHRoZSBj" + + "dXJyZW50IFVuaXggdGltZSBhcyBhbiBJbnRlZ2VyCmludCBub3coKSBhc20gIk5PVyI7Cgo7OzsgUmV0dXJucyB0aGUgaW50ZXJuYWwgYWRkcmVzcyBvZiB0aGUgY3Vy" + + "cmVudCBzbWFydCBjb250cmFjdCBhcyBhIFNsaWNlIHdpdGggYSBgTXNnQWRkcmVzc0ludGAuCjs7OyBJZiBuZWNlc3NhcnksIGl0IGNhbiBiZSBwYXJzZWQgZnVydGhl" + + "ciB1c2luZyBwcmltaXRpdmVzIHN1Y2ggYXMgW3BhcnNlX3N0ZF9hZGRyXS4Kc2xpY2UgbXlfYWRkcmVzcygpIGFzbSAiTVlBRERSIjsKCjs7OyBSZXR1cm5zIHRoZSBi" + + "YWxhbmNlIG9mIHRoZSBzbWFydCBjb250cmFjdCBhcyBhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgYW4gaW50Cjs7OyAoYmFsYW5jZSBpbiBuYW5vdG9uY29pbnMpIGFuZCBh" + + "IGBjZWxsYAo7OzsgKGEgZGljdGlvbmFyeSB3aXRoIDMyLWJpdCBrZXlzIHJlcHJlc2VudGluZyB0aGUgYmFsYW5jZSBvZiAiZXh0cmEgY3VycmVuY2llcyIpCjs7OyBh" + + "dCB0aGUgc3RhcnQgb2YgQ29tcHV0YXRpb24gUGhhc2UuCjs7OyBOb3RlIHRoYXQgUkFXIHByaW1pdGl2ZXMgc3VjaCBhcyBbc2VuZF9yYXdfbWVzc2FnZV0gZG8gbm90" + + "IHVwZGF0ZSB0aGlzIGZpZWxkLgpbaW50LCBjZWxsXSBnZXRfYmFsYW5jZSgpIGFzbSAiQkFMQU5DRSI7Cgo7OzsgUmV0dXJucyB0aGUgbG9naWNhbCB0aW1lIG9mIHRo" + + "ZSBjdXJyZW50IHRyYW5zYWN0aW9uLgppbnQgY3VyX2x0KCkgYXNtICJMVElNRSI7Cgo7OzsgUmV0dXJucyB0aGUgc3RhcnRpbmcgbG9naWNhbCB0aW1lIG9mIHRoZSBj" + + "dXJyZW50IGJsb2NrLgppbnQgYmxvY2tfbHQoKSBhc20gIkJMT0NLTFQiOwoKOzs7IENvbXB1dGVzIHRoZSByZXByZXNlbnRhdGlvbiBoYXNoIG9mIGEgYGNlbGxgIFtj" + + "XSBhbmQgcmV0dXJucyBpdCBhcyBhIDI1Ni1iaXQgdW5zaWduZWQgaW50ZWdlciBgeGAuCjs7OyBVc2VmdWwgZm9yIHNpZ25pbmcgYW5kIGNoZWNraW5nIHNpZ25hdHVy" + + "ZXMgb2YgYXJiaXRyYXJ5IGVudGl0aWVzIHJlcHJlc2VudGVkIGJ5IGEgdHJlZSBvZiBjZWxscy4KaW50IGNlbGxfaGFzaChjZWxsIGMpIGFzbSAiSEFTSENVIjsKCjs7" + + "OyBDb21wdXRlcyB0aGUgaGFzaCBvZiBhIGBzbGljZSBzYCBhbmQgcmV0dXJucyBpdCBhcyBhIDI1Ni1iaXQgdW5zaWduZWQgaW50ZWdlciBgeGAuCjs7OyBUaGUgcmVz" + + "dWx0IGlzIHRoZSBzYW1lIGFzIGlmIGFuIG9yZGluYXJ5IGNlbGwgY29udGFpbmluZyBvbmx5IGRhdGEgYW5kIHJlZmVyZW5jZXMgZnJvbSBgc2AgaGFkIGJlZW4gY3Jl" + + "YXRlZAo7OzsgYW5kIGl0cyBoYXNoIGNvbXB1dGVkIGJ5IFtjZWxsX2hhc2hdLgppbnQgc2xpY2VfaGFzaChzbGljZSBzKSBhc20gIkhBU0hTVSI7Cgo7OzsgQ29tcHV0" + + "ZXMgc2hhMjU2IG9mIHRoZSBkYXRhIGJpdHMgb2YgYHNsaWNlYCBbc10uIElmIHRoZSBiaXQgbGVuZ3RoIG9mIGBzYCBpcyBub3QgZGl2aXNpYmxlIGJ5IGVpZ2h0LAo7" + + "OzsgdGhyb3dzIGEgY2VsbCB1bmRlcmZsb3cgZXhjZXB0aW9uLiBUaGUgaGFzaCB2YWx1ZSBpcyByZXR1cm5lZCBhcyBhIDI1Ni1iaXQgdW5zaWduZWQgaW50ZWdlciBg" + + "eGAuCmludCBzdHJpbmdfaGFzaChzbGljZSBzKSBhc20gIlNIQTI1NlUiOwoKey0KICAjIFNpZ25hdHVyZSBjaGVja3MKLX0KCjs7OyBDaGVja3MgdGhlIEVkMjU1MTkt" + + "YHNpZ25hdHVyZWAgb2YgYSBgaGFzaGAgKGEgMjU2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLCB1c3VhbGx5IGNvbXB1dGVkIGFzIHRoZSBoYXNoIG9mIHNvbWUgZGF0YSkK" + + "Ozs7IHVzaW5nIFtwdWJsaWNfa2V5XSAoYWxzbyByZXByZXNlbnRlZCBieSBhIDI1Ni1iaXQgdW5zaWduZWQgaW50ZWdlcikuCjs7OyBUaGUgc2lnbmF0dXJlIG11c3Qg" + + "Y29udGFpbiBhdCBsZWFzdCA1MTIgZGF0YSBiaXRzOyBvbmx5IHRoZSBmaXJzdCA1MTIgYml0cyBhcmUgdXNlZC4KOzs7IFRoZSByZXN1bHQgaXMgYOKIkjFgIGlmIHRo" + + "ZSBzaWduYXR1cmUgaXMgdmFsaWQsIGAwYCBvdGhlcndpc2UuCjs7OyBOb3RlIHRoYXQgYENIS1NJR05VYCBjcmVhdGVzIGEgMjU2LWJpdCBzbGljZSB3aXRoIHRoZSBo" + + "YXNoIGFuZCBjYWxscyBgQ0hLU0lHTlNgLgo7OzsgVGhhdCBpcywgaWYgW2hhc2hdIGlzIGNvbXB1dGVkIGFzIHRoZSBoYXNoIG9mIHNvbWUgZGF0YSwgdGhlc2UgZGF0" + + "YSBhcmUgaGFzaGVkIHR3aWNlLAo7OzsgdGhlIHNlY29uZCBoYXNoaW5nIG9jY3VycmluZyBpbnNpZGUgYENIS1NJR05TYC4KaW50IGNoZWNrX3NpZ25hdHVyZShpbnQg" + + "aGFzaCwgc2xpY2Ugc2lnbmF0dXJlLCBpbnQgcHVibGljX2tleSkgYXNtICJDSEtTSUdOVSI7Cgo7OzsgQ2hlY2tzIHdoZXRoZXIgW3NpZ25hdHVyZV0gaXMgYSB2YWxp" + + "ZCBFZDI1NTE5LXNpZ25hdHVyZSBvZiB0aGUgZGF0YSBwb3J0aW9uIG9mIGBzbGljZSBkYXRhYCB1c2luZyBgcHVibGljX2tleWAsCjs7OyBzaW1pbGFybHkgdG8gW2No" + + "ZWNrX3NpZ25hdHVyZV0uCjs7OyBJZiB0aGUgYml0IGxlbmd0aCBvZiBbZGF0YV0gaXMgbm90IGRpdmlzaWJsZSBieSBlaWdodCwgdGhyb3dzIGEgY2VsbCB1bmRlcmZs" + + "b3cgZXhjZXB0aW9uLgo7OzsgVGhlIHZlcmlmaWNhdGlvbiBvZiBFZDI1NTE5IHNpZ25hdHVyZXMgaXMgdGhlIHN0YW5kYXJkIG9uZSwKOzs7IHdpdGggc2hhMjU2IHVz" + + "ZWQgdG8gcmVkdWNlIFtkYXRhXSB0byB0aGUgMjU2LWJpdCBudW1iZXIgdGhhdCBpcyBhY3R1YWxseSBzaWduZWQuCmludCBjaGVja19kYXRhX3NpZ25hdHVyZShzbGlj" + + "ZSBkYXRhLCBzbGljZSBzaWduYXR1cmUsIGludCBwdWJsaWNfa2V5KSBhc20gIkNIS1NJR05TIjsKCnstLS0KICAjIENvbXB1dGF0aW9uIG9mIGJvYyBzaXplCiAgVGhl" + + "IHByaW1pdGl2ZXMgYmVsb3cgbWF5IGJlIHVzZWZ1bCBmb3IgY29tcHV0aW5nIHN0b3JhZ2UgZmVlcyBvZiB1c2VyLXByb3ZpZGVkIGRhdGEuCi19Cgo7OzsgUmV0dXJu" + + "cyBgKHgsIHksIHosIC0xKWAgb3IgYChudWxsLCBudWxsLCBudWxsLCAwKWAuCjs7OyBSZWN1cnNpdmVseSBjb21wdXRlcyB0aGUgY291bnQgb2YgZGlzdGluY3QgY2Vs" + + "bHMgYHhgLCBkYXRhIGJpdHMgYHlgLCBhbmQgY2VsbCByZWZlcmVuY2VzIGB6YAo7OzsgaW4gdGhlIERBRyByb290ZWQgYXQgYGNlbGxgIFtjXSwgZWZmZWN0aXZlbHkg" + + "cmV0dXJuaW5nIHRoZSB0b3RhbCBzdG9yYWdlIHVzZWQgYnkgdGhpcyBEQUcgdGFraW5nIGludG8gYWNjb3VudAo7OzsgdGhlIGlkZW50aWZpY2F0aW9uIG9mIGVxdWFs" + + "IGNlbGxzLgo7OzsgVGhlIHZhbHVlcyBvZiBgeGAsIGB5YCwgYW5kIGB6YCBhcmUgY29tcHV0ZWQgYnkgYSBkZXB0aC1maXJzdCB0cmF2ZXJzYWwgb2YgdGhpcyBEQUcs" + + "Cjs7OyB3aXRoIGEgaGFzaCB0YWJsZSBvZiB2aXNpdGVkIGNlbGwgaGFzaGVzIHVzZWQgdG8gcHJldmVudCB2aXNpdHMgb2YgYWxyZWFkeS12aXNpdGVkIGNlbGxzLgo7" + + "OzsgVGhlIHRvdGFsIGNvdW50IG9mIHZpc2l0ZWQgY2VsbHMgYHhgIGNhbm5vdCBleGNlZWQgbm9uLW5lZ2F0aXZlIFttYXhfY2VsbHNdOwo7Ozsgb3RoZXJ3aXNlIHRo" + + "ZSBjb21wdXRhdGlvbiBpcyBhYm9ydGVkIGJlZm9yZSB2aXNpdGluZyB0aGUgYChtYXhfY2VsbHMgKyAxKWAtc3QgY2VsbCBhbmQKOzs7IGEgemVybyBmbGFnIGlzIHJl" + + "dHVybmVkIHRvIGluZGljYXRlIGZhaWx1cmUuIElmIFtjXSBpcyBgbnVsbGAsIHJldHVybnMgYHggPSB5ID0geiA9IDBgLgooaW50LCBpbnQsIGludCkgY29tcHV0ZV9k" + + "YXRhX3NpemUoY2VsbCBjLCBpbnQgbWF4X2NlbGxzKSBpbXB1cmUgYXNtICJDREFUQVNJWkUiOwoKOzs7IFNpbWlsYXIgdG8gW2NvbXB1dGVfZGF0YV9zaXplP10sIGJ1" + + "dCBhY2NlcHRpbmcgYSBgc2xpY2VgIFtzXSBpbnN0ZWFkIG9mIGEgYGNlbGxgLgo7OzsgVGhlIHJldHVybmVkIHZhbHVlIG9mIGB4YCBkb2VzIG5vdCB0YWtlIGludG8g" + + "YWNjb3VudCB0aGUgY2VsbCB0aGF0IGNvbnRhaW5zIHRoZSBgc2xpY2VgIFtzXSBpdHNlbGY7Cjs7OyBob3dldmVyLCB0aGUgZGF0YSBiaXRzIGFuZCB0aGUgY2VsbCBy" + + "ZWZlcmVuY2VzIG9mIFtzXSBhcmUgYWNjb3VudGVkIGZvciBpbiBgeWAgYW5kIGB6YC4KKGludCwgaW50LCBpbnQpIHNsaWNlX2NvbXB1dGVfZGF0YV9zaXplKHNsaWNl" + + "IHMsIGludCBtYXhfY2VsbHMpIGltcHVyZSBhc20gIlNEQVRBU0laRSI7Cgo7OzsgQSBub24tcXVpZXQgdmVyc2lvbiBvZiBbY29tcHV0ZV9kYXRhX3NpemU/XSB0aGF0" + + "IHRocm93cyBhIGNlbGwgb3ZlcmZsb3cgZXhjZXB0aW9uIChgOGApIG9uIGZhaWx1cmUuCihpbnQsIGludCwgaW50LCBpbnQpIGNvbXB1dGVfZGF0YV9zaXplPyhjZWxs" + + "IGMsIGludCBtYXhfY2VsbHMpIGFzbSAiQ0RBVEFTSVpFUSBOVUxMU1dBUElGTk9UMiBOVUxMU1dBUElGTk9UIjsKCjs7OyBBIG5vbi1xdWlldCB2ZXJzaW9uIG9mIFtz" + + "bGljZV9jb21wdXRlX2RhdGFfc2l6ZT9dIHRoYXQgdGhyb3dzIGEgY2VsbCBvdmVyZmxvdyBleGNlcHRpb24gKDgpIG9uIGZhaWx1cmUuCihpbnQsIGludCwgaW50LCBp" + + "bnQpIHNsaWNlX2NvbXB1dGVfZGF0YV9zaXplPyhjZWxsIGMsIGludCBtYXhfY2VsbHMpIGFzbSAiU0RBVEFTSVpFUSBOVUxMU1dBUElGTk9UMiBOVUxMU1dBUElGTk9U" + + "IjsKCjs7OyBUaHJvd3MgYW4gZXhjZXB0aW9uIHdpdGggZXhpdF9jb2RlIGV4Y25vIGlmIGNvbmQgaXMgbm90IDAgKGNvbW1lbnRlZCBzaW5jZSBpbXBsZW1lbnRlZCBp" + + "biBjb21waWxhdG9yKQo7OyAoKSB0aHJvd19pZihpbnQgZXhjbm8sIGludCBjb25kKSBpbXB1cmUgYXNtICJUSFJPV0FSR0lGIjsKCnstLQogICMgRGVidWcgcHJpbWl0" + + "aXZlcwogIE9ubHkgd29ya3MgZm9yIGxvY2FsIFRWTSBleGVjdXRpb24gd2l0aCBkZWJ1ZyBsZXZlbCB2ZXJib3NpdHkKLX0KOzs7IER1bXBzIHRoZSBzdGFjayAoYXQg" + + "bW9zdCB0aGUgdG9wIDI1NSB2YWx1ZXMpIGFuZCBzaG93cyB0aGUgdG90YWwgc3RhY2sgZGVwdGguCigpIGR1bXBfc3RhY2soKSBpbXB1cmUgYXNtICJEVU1QU1RLIjsK" + + "CnstCiAgIyBQZXJzaXN0ZW50IHN0b3JhZ2Ugc2F2ZSBhbmQgbG9hZAotfQoKOzs7IFJldHVybnMgdGhlIHBlcnNpc3RlbnQgY29udHJhY3Qgc3RvcmFnZSBjZWxsLiBJ" + + "dCBjYW4gYmUgcGFyc2VkIG9yIG1vZGlmaWVkIHdpdGggc2xpY2UgYW5kIGJ1aWxkZXIgcHJpbWl0aXZlcyBsYXRlci4KY2VsbCBnZXRfZGF0YSgpIGFzbSAiYzQgUFVT" + + "SCI7Cgo7OzsgU2V0cyBgY2VsbGAgW2NdIGFzIHBlcnNpc3RlbnQgY29udHJhY3QgZGF0YS4gWW91IGNhbiB1cGRhdGUgcGVyc2lzdGVudCBjb250cmFjdCBzdG9yYWdl" + + "IHdpdGggdGhpcyBwcmltaXRpdmUuCigpIHNldF9kYXRhKGNlbGwgYykgaW1wdXJlIGFzbSAiYzQgUE9QIjsKCnstCiAgIyBDb250aW51YXRpb24gcHJpbWl0aXZlcwot" + + "fQo7OzsgVXN1YWxseSBgYzNgIGhhcyBhIGNvbnRpbnVhdGlvbiBpbml0aWFsaXplZCBieSB0aGUgd2hvbGUgY29kZSBvZiB0aGUgY29udHJhY3QuIEl0IGlzIHVzZWQg" + + "Zm9yIGZ1bmN0aW9uIGNhbGxzLgo7OzsgVGhlIHByaW1pdGl2ZSByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIGBjM2AuCmNvbnQgZ2V0X2MzKCkgaW1wdXJlIGFz" + + "bSAiYzMgUFVTSCI7Cgo7OzsgVXBkYXRlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiBgYzNgLiBVc3VhbGx5LCBpdCBpcyB1c2VkIGZvciB1cGRhdGluZyBzbWFydCBjb250" + + "cmFjdCBjb2RlIGluIHJ1bi10aW1lLgo7OzsgTm90ZSB0aGF0IGFmdGVyIGV4ZWN1dGlvbiBvZiB0aGlzIHByaW1pdGl2ZSB0aGUgY3VycmVudCBjb2RlCjs7OyAoYW5k" + + "IHRoZSBzdGFjayBvZiByZWN1cnNpdmUgZnVuY3Rpb24gY2FsbHMpIHdvbid0IGNoYW5nZSwKOzs7IGJ1dCBhbnkgb3RoZXIgZnVuY3Rpb24gY2FsbCB3aWxsIHVzZSBh" + + "IGZ1bmN0aW9uIGZyb20gdGhlIG5ldyBjb2RlLgooKSBzZXRfYzMoY29udCBjKSBpbXB1cmUgYXNtICJjMyBQT1AiOwoKOzs7IFRyYW5zZm9ybXMgYSBgc2xpY2VgIFtz" + + "XSBpbnRvIGEgc2ltcGxlIG9yZGluYXJ5IGNvbnRpbnVhdGlvbiBgY2AsIHdpdGggYGMuY29kZSA9IHNgIGFuZCBhbiBlbXB0eSBzdGFjayBhbmQgc2F2ZWxpc3QuCmNv" + + "bnQgYmxlc3Moc2xpY2UgcykgaW1wdXJlIGFzbSAiQkxFU1MiOwoKey0tLQogICMgR2FzIHJlbGF0ZWQgcHJpbWl0aXZlcwotfQoKOzs7IFNldHMgY3VycmVudCBnYXMg" + + "bGltaXQgYGdsYCB0byBpdHMgbWF4aW1hbCBhbGxvd2VkIHZhbHVlIGBnbWAsIGFuZCByZXNldHMgdGhlIGdhcyBjcmVkaXQgYGdjYCB0byB6ZXJvLAo7OzsgZGVjcmVh" + + "c2luZyB0aGUgdmFsdWUgb2YgYGdyYCBieSBgZ2NgIGluIHRoZSBwcm9jZXNzLgo7OzsgSW4gb3RoZXIgd29yZHMsIHRoZSBjdXJyZW50IHNtYXJ0IGNvbnRyYWN0IGFn" + + "cmVlcyB0byBidXkgc29tZSBnYXMgdG8gZmluaXNoIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgo7OzsgVGhpcyBhY3Rpb24gaXMgcmVxdWlyZWQgdG8gcHJvY2VzcyBl" + + "eHRlcm5hbCBtZXNzYWdlcywgd2hpY2ggYnJpbmcgbm8gdmFsdWUgKGhlbmNlIG5vIGdhcykgd2l0aCB0aGVtc2VsdmVzLgo7OzsKOzs7IEZvciBtb3JlIGRldGFpbHMg" + + "Y2hlY2sgW2FjY2VwdF9tZXNzYWdlIGVmZmVjdHNdKGh0dHBzOi8vdG9uLm9yZy9kb2NzLyMvc21hcnQtY29udHJhY3RzL2FjY2VwdCkuCigpIGFjY2VwdF9tZXNzYWdl" + + "KCkgaW1wdXJlIGFzbSAiQUNDRVBUIjsKCjs7OyBTZXRzIGN1cnJlbnQgZ2FzIGxpbWl0IGBnbGAgdG8gdGhlIG1pbmltdW0gb2YgbGltaXQgYW5kIGBnbWAsIGFuZCBy" + + "ZXNldHMgdGhlIGdhcyBjcmVkaXQgYGdjYCB0byB6ZXJvLgo7OzsgSWYgdGhlIGdhcyBjb25zdW1lZCBzbyBmYXIgKGluY2x1ZGluZyB0aGUgcHJlc2VudCBpbnN0cnVj" + + "dGlvbikgZXhjZWVkcyB0aGUgcmVzdWx0aW5nIHZhbHVlIG9mIGBnbGAsCjs7OyBhbiAodW5oYW5kbGVkKSBvdXQgb2YgZ2FzIGV4Y2VwdGlvbiBpcyB0aHJvd24gYmVm" + + "b3JlIHNldHRpbmcgbmV3IGdhcyBsaW1pdHMuCjs7OyBOb3RpY2UgdGhhdCBbc2V0X2dhc19saW1pdF0gd2l0aCBhbiBhcmd1bWVudCBgbGltaXQg4omlIDJeNjMg4oiS" + + "IDFgIGlzIGVxdWl2YWxlbnQgdG8gW2FjY2VwdF9tZXNzYWdlXS4KKCkgc2V0X2dhc19saW1pdChpbnQgbGltaXQpIGltcHVyZSBhc20gIlNFVEdBU0xJTUlUIjsKCjs7" + + "OyBDb21taXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHJlZ2lzdGVycyBgYzRgICjigJxwZXJzaXN0ZW50IGRhdGHigJ0pIGFuZCBgYzVgICjigJxhY3Rpb25z4oCdKQo7" + + "Ozsgc28gdGhhdCB0aGUgY3VycmVudCBleGVjdXRpb24gaXMgY29uc2lkZXJlZCDigJxzdWNjZXNzZnVs4oCdIHdpdGggdGhlIHNhdmVkIHZhbHVlcyBldmVuIGlmIGFu" + + "IGV4Y2VwdGlvbgo7OzsgaW4gQ29tcHV0YXRpb24gUGhhc2UgaXMgdGhyb3duIGxhdGVyLgooKSBjb21taXQoKSBpbXB1cmUgYXNtICJDT01NSVQiOwoKOzs7IE5vdCBp" + + "bXBsZW1lbnRlZAo7OzsgQ29tcHV0ZXMgdGhlIGFtb3VudCBvZiBnYXMgdGhhdCBjYW4gYmUgYm91Z2h0IGZvciBgYW1vdW50YCBuYW5vVE9OcywKOzs7IGFuZCBzZXRz" + + "IGBnbGAgYWNjb3JkaW5nbHkgaW4gdGhlIHNhbWUgd2F5IGFzIFtzZXRfZ2FzX2xpbWl0XS4KOzsoKSBidXlfZ2FzKGludCBhbW91bnQpIGltcHVyZSBhc20gIkJVWUdB" + + "UyI7Cgo7OzsgQ29tcHV0ZXMgdGhlIG1pbmltdW0gb2YgdHdvIGludGVnZXJzIFt4XSBhbmQgW3ldLgppbnQgbWluKGludCB4LCBpbnQgeSkgYXNtICJNSU4iOwoKOzs7" + + "IENvbXB1dGVzIHRoZSBtYXhpbXVtIG9mIHR3byBpbnRlZ2VycyBbeF0gYW5kIFt5XS4KaW50IG1heChpbnQgeCwgaW50IHkpIGFzbSAiTUFYIjsKCjs7OyBTb3J0cyB0" + + "d28gaW50ZWdlcnMuCihpbnQsIGludCkgbWlubWF4KGludCB4LCBpbnQgeSkgYXNtICJNSU5NQVgiOwoKOzs7IENvbXB1dGVzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBh" + + "biBpbnRlZ2VyIFt4XS4KaW50IGFicyhpbnQgeCkgYXNtICJBQlMiOwoKey0KICAjIFNsaWNlIHByaW1pdGl2ZXMKCiAgSXQgaXMgc2FpZCB0aGF0IGEgcHJpbWl0aXZl" + + "IF9sb2Fkc18gc29tZSBkYXRhLAogIGlmIGl0IHJldHVybnMgdGhlIGRhdGEgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIHNsaWNlCiAgKHNvIGl0IGNhbiBhbHNvIGJl" + + "IHVzZWQgYXMgW21vZGlmeWluZyBtZXRob2RdKGh0dHBzOi8vdG9uLm9yZy9kb2NzLyMvZnVuYy9zdGF0ZW1lbnRzP2lkPW1vZGlmeWluZy1tZXRob2RzKSkuCgogIEl0" + + "IGlzIHNhaWQgdGhhdCBhIHByaW1pdGl2ZSBfcHJlbG9hZHNfIHNvbWUgZGF0YSwgaWYgaXQgcmV0dXJucyBvbmx5IHRoZSBkYXRhCiAgKGl0IGNhbiBiZSB1c2VkIGFz" + + "IFtub24tbW9kaWZ5aW5nIG1ldGhvZF0oaHR0cHM6Ly90b24ub3JnL2RvY3MvIy9mdW5jL3N0YXRlbWVudHM/aWQ9bm9uLW1vZGlmeWluZy1tZXRob2RzKSkuCgogIFVu" + + "bGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBsb2FkaW5nIGFuZCBwcmVsb2FkaW5nIHByaW1pdGl2ZXMgcmVhZCB0aGUgZGF0YSBmcm9tIGEgcHJlZml4IG9mIHRoZSBzbGlj" + + "ZS4KLX0KCgo7OzsgQ29udmVydHMgYSBgY2VsbGAgW2NdIGludG8gYSBgc2xpY2VgLiBOb3RpY2UgdGhhdCBbY10gbXVzdCBiZSBlaXRoZXIgYW4gb3JkaW5hcnkgY2Vs" + + "bCwKOzs7IG9yIGFuIGV4b3RpYyBjZWxsIChzZWUgW1RWTS5wZGZdKGh0dHBzOi8vdG9uLWJsb2NrY2hhaW4uZ2l0aHViLmlvL2RvY3MvdHZtLnBkZiksIDMuMS4yKQo7" + + "Ozsgd2hpY2ggaXMgYXV0b21hdGljYWxseSBsb2FkZWQgdG8geWllbGQgYW4gb3JkaW5hcnkgY2VsbCBgYydgLCBjb252ZXJ0ZWQgaW50byBhIGBzbGljZWAgYWZ0ZXJ3" + + "YXJkcy4Kc2xpY2UgYmVnaW5fcGFyc2UoY2VsbCBjKSBhc20gIkNUT1MiOwoKOzs7IENoZWNrcyBpZiBbc10gaXMgZW1wdHkuIElmIG5vdCwgdGhyb3dzIGFuIGV4Y2Vw" + + "dGlvbi4KKCkgZW5kX3BhcnNlKHNsaWNlIHMpIGltcHVyZSBhc20gIkVORFMiOwoKOzs7IExvYWRzIHRoZSBmaXJzdCByZWZlcmVuY2UgZnJvbSB0aGUgc2xpY2UuCihz" + + "bGljZSwgY2VsbCkgbG9hZF9yZWYoc2xpY2UgcykgYXNtKC0+IDEgMCkgIkxEUkVGIjsKCjs7OyBQcmVsb2FkcyB0aGUgZmlyc3QgcmVmZXJlbmNlIGZyb20gdGhlIHNs" + + "aWNlLgpjZWxsIHByZWxvYWRfcmVmKHNsaWNlIHMpIGFzbSAiUExEUkVGIjsKCnstIEZ1bmN0aW9ucyBiZWxvdyBhcmUgY29tbWVudGVkIGJlY2F1c2UgYXJlIGltcGxl" + + "bWVudGVkIG9uIGNvbXBpbGF0b3IgbGV2ZWwgZm9yIG9wdGltaXNhdGlvbiAtfQoKOzs7IExvYWRzIGEgc2lnbmVkIFtsZW5dLWJpdCBpbnRlZ2VyIGZyb20gYSBzbGlj" + + "ZSBbc10uCjs7IChzbGljZSwgaW50KSB+bG9hZF9pbnQoc2xpY2UgcywgaW50IGxlbikgYXNtKHMgbGVuIC0+IDEgMCkgIkxESVgiOwoKOzs7IExvYWRzIGFuIHVuc2ln" + + "bmVkIFtsZW5dLWJpdCBpbnRlZ2VyIGZyb20gYSBzbGljZSBbc10uCjs7IChzbGljZSwgaW50KSB+bG9hZF91aW50KHNsaWNlIHMsIGludCBsZW4pIGFzbSggLT4gMSAw" + + "KSAiTERVWCI7Cgo7OzsgUHJlbG9hZHMgYSBzaWduZWQgW2xlbl0tYml0IGludGVnZXIgZnJvbSBhIHNsaWNlIFtzXS4KOzsgaW50IHByZWxvYWRfaW50KHNsaWNlIHMs" + + "IGludCBsZW4pIGFzbSAiUExESVgiOwoKOzs7IFByZWxvYWRzIGFuIHVuc2lnbmVkIFtsZW5dLWJpdCBpbnRlZ2VyIGZyb20gYSBzbGljZSBbc10uCjs7IGludCBwcmVs" + + "b2FkX3VpbnQoc2xpY2UgcywgaW50IGxlbikgYXNtICJQTERVWCI7Cgo7OzsgTG9hZHMgdGhlIGZpcnN0IGAwIOKJpCBsZW4g4omkIDEwMjNgIGJpdHMgZnJvbSBzbGlj" + + "ZSBbc10gaW50byBhIHNlcGFyYXRlIGBzbGljZSBzJydgLgo7OyAoc2xpY2UsIHNsaWNlKSBsb2FkX2JpdHMoc2xpY2UgcywgaW50IGxlbikgYXNtKHMgbGVuIC0+IDEg" + + "MCkgIkxEU0xJQ0VYIjsKCjs7OyBQcmVsb2FkcyB0aGUgZmlyc3QgYDAg4omkIGxlbiDiiaQgMTAyM2AgYml0cyBmcm9tIHNsaWNlIFtzXSBpbnRvIGEgc2VwYXJhdGUg" + + "YHNsaWNlIHMnJ2AuCjs7IHNsaWNlIHByZWxvYWRfYml0cyhzbGljZSBzLCBpbnQgbGVuKSBhc20gIlBMRFNMSUNFWCI7Cgo7OzsgTG9hZHMgc2VyaWFsaXplZCBhbW91" + + "bnQgb2YgVG9uQ29pbnMgKGFueSB1bnNpZ25lZCBpbnRlZ2VyIHVwIHRvIGAyXjEyMCAtIDFgKS4KKHNsaWNlLCBpbnQpIGxvYWRfZ3JhbXMoc2xpY2UgcykgYXNtKC0+" + + "IDEgMCkgIkxER1JBTVMiOwooc2xpY2UsIGludCkgbG9hZF9jb2lucyhzbGljZSBzKSBhc20oLT4gMSAwKSAiTERWQVJVSU5UMTYiOwoKKHNsaWNlLCBpbnQpIGxvYWRf" + + "dmFyaW50MTYoc2xpY2UgcykgYXNtKC0+IDEgMCkgIkxEVkFSSU5UMTYiOwooc2xpY2UsIGludCkgbG9hZF92YXJpbnQzMihzbGljZSBzKSBhc20oLT4gMSAwKSAiTERW" + + "QVJJTlQzMiI7CihzbGljZSwgaW50KSBsb2FkX3ZhcnVpbnQxNihzbGljZSBzKSBhc20oLT4gMSAwKSAiTERWQVJVSU5UMTYiOwooc2xpY2UsIGludCkgbG9hZF92YXJ1" + + "aW50MzIoc2xpY2UgcykgYXNtKC0+IDEgMCkgIkxEVkFSVUlOVDMyIjsKCjs7OyBSZXR1cm5zIGFsbCBidXQgdGhlIGZpcnN0IGAwIOKJpCBsZW4g4omkIDEwMjNgIGJp" + + "dHMgb2YgYHNsaWNlYCBbc10uCnNsaWNlIHNraXBfYml0cyhzbGljZSBzLCBpbnQgbGVuKSBhc20gIlNEU0tJUEZJUlNUIjsKKHNsaWNlLCAoKSkgfnNraXBfYml0cyhz" + + "bGljZSBzLCBpbnQgbGVuKSBhc20gIlNEU0tJUEZJUlNUIjsKCjs7OyBSZXR1cm5zIHRoZSBmaXJzdCBgMCDiiaQgbGVuIOKJpCAxMDIzYCBiaXRzIG9mIGBzbGljZWAg" + + "W3NdLgpzbGljZSBmaXJzdF9iaXRzKHNsaWNlIHMsIGludCBsZW4pIGFzbSAiU0RDVVRGSVJTVCI7Cgo7OzsgUmV0dXJucyBhbGwgYnV0IHRoZSBsYXN0IGAwIOKJpCBs" + + "ZW4g4omkIDEwMjNgIGJpdHMgb2YgYHNsaWNlYCBbc10uCnNsaWNlIHNraXBfbGFzdF9iaXRzKHNsaWNlIHMsIGludCBsZW4pIGFzbSAiU0RTS0lQTEFTVCI7CihzbGlj" + + "ZSwgKCkpIH5za2lwX2xhc3RfYml0cyhzbGljZSBzLCBpbnQgbGVuKSBhc20gIlNEU0tJUExBU1QiOwoKOzs7IFJldHVybnMgdGhlIGxhc3QgYDAg4omkIGxlbiDiiaQg" + + "MTAyM2AgYml0cyBvZiBgc2xpY2VgIFtzXS4Kc2xpY2Ugc2xpY2VfbGFzdChzbGljZSBzLCBpbnQgbGVuKSBhc20gIlNEQ1VUTEFTVCI7Cgo7OzsgTG9hZHMgYSBkaWN0" + + "aW9uYXJ5IGBEYCAoSGFzaE1hcEUpIGZyb20gYHNsaWNlYCBbc10uCjs7OyAocmV0dXJucyBgbnVsbGAgaWYgYG5vdGhpbmdgIGNvbnN0cnVjdG9yIGlzIHVzZWQpLgoo" + + "c2xpY2UsIGNlbGwpIGxvYWRfZGljdChzbGljZSBzKSBhc20oLT4gMSAwKSAiTERESUNUIjsKCjs7OyBQcmVsb2FkcyBhIGRpY3Rpb25hcnkgYERgIGZyb20gYHNsaWNl" + + "YCBbc10uCmNlbGwgcHJlbG9hZF9kaWN0KHNsaWNlIHMpIGFzbSAiUExERElDVCI7Cgo7OzsgTG9hZHMgYSBkaWN0aW9uYXJ5IGFzIFtsb2FkX2RpY3RdLCBidXQgcmV0" + + "dXJucyBvbmx5IHRoZSByZW1haW5kZXIgb2YgdGhlIHNsaWNlLgpzbGljZSBza2lwX2RpY3Qoc2xpY2UgcykgYXNtICJTS0lQRElDVCI7CihzbGljZSwgKCkpIH5za2lw" + + "X2RpY3Qoc2xpY2UgcykgYXNtICJTS0lQRElDVCI7Cgo7OzsgTG9hZHMgKE1heWJlIF5DZWxsKSBmcm9tIGBzbGljZWAgW3NdLgo7OzsgSW4gb3RoZXIgd29yZHMgbG9h" + + "ZHMgMSBiaXQgYW5kIGlmIGl0IGlzIHRydWUKOzs7IGxvYWRzIGZpcnN0IHJlZiBhbmQgcmV0dXJuIGl0IHdpdGggc2xpY2UgcmVtYWluZGVyCjs7OyBvdGhlcndpc2Ug" + + "cmV0dXJucyBgbnVsbGAgYW5kIHNsaWNlIHJlbWFpbmRlcgooc2xpY2UsIGNlbGwpIGxvYWRfbWF5YmVfcmVmKHNsaWNlIHMpIGFzbSgtPiAxIDApICJMRE9QVFJFRiI7" + + "Cgo7OzsgUHJlbG9hZHMgKE1heWJlIF5DZWxsKSBmcm9tIGBzbGljZWAgW3NdLgpjZWxsIHByZWxvYWRfbWF5YmVfcmVmKHNsaWNlIHMpIGFzbSAiUExET1BUUkVGIjsK" + + "Cgo7OzsgUmV0dXJucyB0aGUgZGVwdGggb2YgYGNlbGxgIFtjXS4KOzs7IElmIFtjXSBoYXMgbm8gcmVmZXJlbmNlcywgdGhlbiByZXR1cm4gYDBgOwo7Ozsgb3RoZXJ3" + + "aXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvbmUgcGx1cyB0aGUgbWF4aW11bSBvZiBkZXB0aHMgb2YgY2VsbHMgcmVmZXJyZWQgdG8gZnJvbSBbY10uCjs7OyBJZiBb" + + "Y10gaXMgYSBgbnVsbGAgaW5zdGVhZCBvZiBhIGNlbGwsIHJldHVybnMgemVyby4KaW50IGNlbGxfZGVwdGgoY2VsbCBjKSBhc20gIkNERVBUSCI7CgoKey0KICAjIFNs" + + "aWNlIHNpemUgcHJpbWl0aXZlcwotfQoKOzs7IFJldHVybnMgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzIGluIGBzbGljZWAgW3NdLgppbnQgc2xpY2VfcmVmcyhzbGlj" + + "ZSBzKSBhc20gIlNSRUZTIjsKCjs7OyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIGluIGBzbGljZWAgW3NdLgppbnQgc2xpY2VfYml0cyhzbGljZSBzKSBh" + + "c20gIlNCSVRTIjsKCjs7OyBSZXR1cm5zIGJvdGggdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgYW5kIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcyBpbiBgc2xpY2VgIFtz" + + "XS4KKGludCwgaW50KSBzbGljZV9iaXRzX3JlZnMoc2xpY2UgcykgYXNtICJTQklUUkVGUyI7Cgo7OzsgQ2hlY2tzIHdoZXRoZXIgYSBgc2xpY2VgIFtzXSBpcyBlbXB0" + + "eSAoaS5lLiwgY29udGFpbnMgbm8gYml0cyBvZiBkYXRhIGFuZCBubyBjZWxsIHJlZmVyZW5jZXMpLgppbnQgc2xpY2VfZW1wdHk/KHNsaWNlIHMpIGFzbSAiU0VNUFRZ" + + "IjsKCjs7OyBDaGVja3Mgd2hldGhlciBgc2xpY2VgIFtzXSBoYXMgbm8gYml0cyBvZiBkYXRhLgppbnQgc2xpY2VfZGF0YV9lbXB0eT8oc2xpY2UgcykgYXNtICJTREVN" + + "UFRZIjsKCjs7OyBDaGVja3Mgd2hldGhlciBgc2xpY2VgIFtzXSBoYXMgbm8gcmVmZXJlbmNlcy4KaW50IHNsaWNlX3JlZnNfZW1wdHk/KHNsaWNlIHMpIGFzbSAiU1JF" + + "TVBUWSI7Cgo7OzsgUmV0dXJucyB0aGUgZGVwdGggb2YgYHNsaWNlYCBbc10uCjs7OyBJZiBbc10gaGFzIG5vIHJlZmVyZW5jZXMsIHRoZW4gcmV0dXJucyBgMGA7Cjs7" + + "OyBvdGhlcndpc2UgdGhlIHJldHVybmVkIHZhbHVlIGlzIG9uZSBwbHVzIHRoZSBtYXhpbXVtIG9mIGRlcHRocyBvZiBjZWxscyByZWZlcnJlZCB0byBmcm9tIFtzXS4K" + + "aW50IHNsaWNlX2RlcHRoKHNsaWNlIHMpIGFzbSAiU0RFUFRIIjsKCnstCiAgIyBCdWlsZGVyIHNpemUgcHJpbWl0aXZlcwotfQoKOzs7IFJldHVybnMgdGhlIG51bWJl" + + "ciBvZiBjZWxsIHJlZmVyZW5jZXMgYWxyZWFkeSBzdG9yZWQgaW4gYGJ1aWxkZXJgIFtiXQppbnQgYnVpbGRlcl9yZWZzKGJ1aWxkZXIgYikgYXNtICJCUkVGUyI7Cgo7" + + "OzsgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyBhbHJlYWR5IHN0b3JlZCBpbiBgYnVpbGRlcmAgW2JdLgppbnQgYnVpbGRlcl9iaXRzKGJ1aWxkZXIgYikg" + + "YXNtICJCQklUUyI7Cgo7OzsgUmV0dXJucyB0aGUgZGVwdGggb2YgYGJ1aWxkZXJgIFtiXS4KOzs7IElmIG5vIGNlbGwgcmVmZXJlbmNlcyBhcmUgc3RvcmVkIGluIFti" + + "XSwgdGhlbiByZXR1cm5zIDA7Cjs7OyBvdGhlcndpc2UgdGhlIHJldHVybmVkIHZhbHVlIGlzIG9uZSBwbHVzIHRoZSBtYXhpbXVtIG9mIGRlcHRocyBvZiBjZWxscyBy" + + "ZWZlcnJlZCB0byBmcm9tIFtiXS4KaW50IGJ1aWxkZXJfZGVwdGgoYnVpbGRlciBiKSBhc20gIkJERVBUSCI7Cgp7LQogICMgQnVpbGRlciBwcmltaXRpdmVzCiAgSXQg" + + "aXMgc2FpZCB0aGF0IGEgcHJpbWl0aXZlIF9zdG9yZXNfIGEgdmFsdWUgYHhgIGludG8gYSBidWlsZGVyIGBiYAogIGlmIGl0IHJldHVybnMgYSBtb2RpZmllZCB2ZXJz" + + "aW9uIG9mIHRoZSBidWlsZGVyIGBiJ2Agd2l0aCB0aGUgdmFsdWUgYHhgIHN0b3JlZCBhdCB0aGUgZW5kIG9mIGl0LgogIEl0IGNhbiBiZSB1c2VkIGFzIFtub24tbW9k" + + "aWZ5aW5nIG1ldGhvZF0oaHR0cHM6Ly90b24ub3JnL2RvY3MvIy9mdW5jL3N0YXRlbWVudHM/aWQ9bm9uLW1vZGlmeWluZy1tZXRob2RzKS4KCiAgQWxsIHRoZSBwcmlt" + + "aXRpdmVzIGJlbG93IGZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluIHRoZSBgYnVpbGRlcmAsCiAgYW5kIG9ubHkgdGhlbiBjaGVjayB0" + + "aGUgcmFuZ2Ugb2YgdGhlIHZhbHVlIGJlaW5nIHNlcmlhbGl6ZWQuCi19Cgo7OzsgQ3JlYXRlcyBhIG5ldyBlbXB0eSBgYnVpbGRlcmAuCmJ1aWxkZXIgYmVnaW5fY2Vs" + + "bCgpIGFzbSAiTkVXQyI7Cgo7OzsgQ29udmVydHMgYSBgYnVpbGRlcmAgaW50byBhbiBvcmRpbmFyeSBgY2VsbGAuCmNlbGwgZW5kX2NlbGwoYnVpbGRlciBiKSBhc20g" + + "IkVOREMiOwoKOzs7IFN0b3JlcyBhIHJlZmVyZW5jZSB0byBgY2VsbGAgW2NdIGludG8gYGJ1aWxkZXJgIFtiXS4KYnVpbGRlciBzdG9yZV9yZWYoYnVpbGRlciBiLCBj" + + "ZWxsIGMpIGFzbShjIGIpICJTVFJFRiI7Cgo7OzsgU3RvcmVzIGFuIHVuc2lnbmVkIFtsZW5dLWJpdCBpbnRlZ2VyIGB4YCBpbnRvIGBiYCBmb3IgYDAg4omkIGxlbiDi" + + "iaQgMjU2YC4KOzsgYnVpbGRlciBzdG9yZV91aW50KGJ1aWxkZXIgYiwgaW50IHgsIGludCBsZW4pIGFzbSh4IGIgbGVuKSAiU1RVWCI7Cgo7OzsgU3RvcmVzIGEgc2ln" + + "bmVkIFtsZW5dLWJpdCBpbnRlZ2VyIGB4YCBpbnRvIGBiYCBmb3JgIDAg4omkIGxlbiDiiaQgMjU3YC4KOzsgYnVpbGRlciBzdG9yZV9pbnQoYnVpbGRlciBiLCBpbnQg" + + "eCwgaW50IGxlbikgYXNtKHggYiBsZW4pICJTVElYIjsKCgo7OzsgU3RvcmVzIGBzbGljZWAgW3NdIGludG8gYGJ1aWxkZXJgIFtiXQpidWlsZGVyIHN0b3JlX3NsaWNl" + + "KGJ1aWxkZXIgYiwgc2xpY2UgcykgYXNtICJTVFNMSUNFUiI7Cgo7OzsgU3RvcmVzIChzZXJpYWxpemVzKSBhbiBpbnRlZ2VyIFt4XSBpbiB0aGUgcmFuZ2UgYDAuLjJe" + + "MTIwIOKIkiAxYCBpbnRvIGBidWlsZGVyYCBbYl0uCjs7OyBUaGUgc2VyaWFsaXphdGlvbiBvZiBbeF0gY29uc2lzdHMgb2YgYSA0LWJpdCB1bnNpZ25lZCBiaWctZW5k" + + "aWFuIGludGVnZXIgYGxgLAo7Ozsgd2hpY2ggaXMgdGhlIHNtYWxsZXN0IGludGVnZXIgYGwg4omlIDBgLCBzdWNoIHRoYXQgYHggPCAyXjhsYCwKOzs7IGZvbGxvd2Vk" + + "IGJ5IGFuIGA4bGAtYml0IHVuc2lnbmVkIGJpZy1lbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgW3hdLgo7OzsgSWYgW3hdIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgc3Vw" + + "cG9ydGVkIHJhbmdlLCBhIHJhbmdlIGNoZWNrIGV4Y2VwdGlvbiBpcyB0aHJvd24uCjs7Owo7OzsgU3RvcmUgYW1vdW50cyBvZiBUb25Db2lucyB0byB0aGUgYnVpbGRl" + + "ciBhcyBWYXJVSW50ZWdlciAxNgpidWlsZGVyIHN0b3JlX2dyYW1zKGJ1aWxkZXIgYiwgaW50IHgpIGFzbSAiU1RHUkFNUyI7CmJ1aWxkZXIgc3RvcmVfY29pbnMoYnVp" + + "bGRlciBiLCBpbnQgeCkgYXNtICJTVFZBUlVJTlQxNiI7CgpidWlsZGVyIHN0b3JlX3ZhcmludDE2KGJ1aWxkZXIgYiwgaW50IHgpIGFzbSAiU1RWQVJJTlQxNiI7CmJ1" + + "aWxkZXIgc3RvcmVfdmFyaW50MzIoYnVpbGRlciBiLCBpbnQgeCkgYXNtICJTVFZBUklOVDMyIjsKYnVpbGRlciBzdG9yZV92YXJ1aW50MTYoYnVpbGRlciBiLCBpbnQg" + + "eCkgYXNtICJTVFZBUlVJTlQxNiI7CmJ1aWxkZXIgc3RvcmVfdmFydWludDMyKGJ1aWxkZXIgYiwgaW50IHgpIGFzbSAiU1RWQVJVSU5UMzIiOwoKOzs7IFN0b3JlcyBk" + + "aWN0aW9uYXJ5IGBEYCByZXByZXNlbnRlZCBieSBgY2VsbGAgW2NdIG9yIGBudWxsYCBpbnRvIGBidWlsZGVyYCBbYl0uCjs7OyBJbiBvdGhlciB3b3Jkcywgc3RvcmVz" + + "IGEgYDFgLWJpdCBhbmQgYSByZWZlcmVuY2UgdG8gW2NdIGlmIFtjXSBpcyBub3QgYG51bGxgIGFuZCBgMGAtYml0IG90aGVyd2lzZS4KYnVpbGRlciBzdG9yZV9kaWN0" + + "KGJ1aWxkZXIgYiwgY2VsbCBjKSBhc20oYyBiKSAiU1RESUNUIjsKCjs7OyBTdG9yZXMgKE1heWJlIF5DZWxsKSB0byBidWlsZGVyOgo7OzsgaWYgY2VsbCBpcyBudWxs" + + "IHN0b3JlIDEgemVybyBiaXQKOzs7IG90aGVyd2lzZSBzdG9yZSAxIHRydWUgYml0IGFuZCByZWYgdG8gY2VsbApidWlsZGVyIHN0b3JlX21heWJlX3JlZihidWlsZGVy" + + "IGIsIGNlbGwgYykgYXNtKGMgYikgIlNUT1BUUkVGIjsKCgp7LQogICMgQWRkcmVzcyBtYW5pcHVsYXRpb24gcHJpbWl0aXZlcwogIFRoZSBhZGRyZXNzIG1hbmlwdWxh" + + "dGlvbiBwcmltaXRpdmVzIGxpc3RlZCBiZWxvdyBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBUTC1CIHNj" + + "aGVtZToKICBgYGBUTC1CCiAgYWRkcl9ub25lJDAwID0gTXNnQWRkcmVzc0V4dDsKICBhZGRyX2V4dGVybiQwMSBsZW46KCMjIDgpIGV4dGVybmFsX2FkZHJlc3M6KGJp" + + "dHMgbGVuKQogICAgICAgICAgICAgICA9IE1zZ0FkZHJlc3NFeHQ7CiAgYW55Y2FzdF9pbmZvJF8gZGVwdGg6KCM8PSAzMCkgeyBkZXB0aCA+PSAxIH0KICAgIHJld3Jp" + + "dGVfcGZ4OihiaXRzIGRlcHRoKSA9IEFueWNhc3Q7CiAgYWRkcl9zdGQkMTAgYW55Y2FzdDooTWF5YmUgQW55Y2FzdCkKICAgIHdvcmtjaGFpbl9pZDppbnQ4IGFkZHJl" + + "c3M6Yml0czI1NiA9IE1zZ0FkZHJlc3NJbnQ7CiAgYWRkcl92YXIkMTEgYW55Y2FzdDooTWF5YmUgQW55Y2FzdCkgYWRkcl9sZW46KCMjIDkpCiAgICB3b3JrY2hhaW5f" + + "aWQ6aW50MzIgYWRkcmVzczooYml0cyBhZGRyX2xlbikgPSBNc2dBZGRyZXNzSW50OwogIF8gXzpNc2dBZGRyZXNzSW50ID0gTXNnQWRkcmVzczsKICBfIF86TXNnQWRk" + + "cmVzc0V4dCA9IE1zZ0FkZHJlc3M7CgogIGludF9tc2dfaW5mbyQwIGlocl9kaXNhYmxlZDpCb29sIGJvdW5jZTpCb29sIGJvdW5jZWQ6Qm9vbAogICAgc3JjOk1zZ0Fk" + + "ZHJlc3MgZGVzdDpNc2dBZGRyZXNzSW50CiAgICB2YWx1ZTpDdXJyZW5jeUNvbGxlY3Rpb24gaWhyX2ZlZTpHcmFtcyBmd2RfZmVlOkdyYW1zCiAgICBjcmVhdGVkX2x0" + + "OnVpbnQ2NCBjcmVhdGVkX2F0OnVpbnQzMiA9IENvbW1vbk1zZ0luZm9SZWxheGVkOwogIGV4dF9vdXRfbXNnX2luZm8kMTEgc3JjOk1zZ0FkZHJlc3MgZGVzdDpNc2dB" + + "ZGRyZXNzRXh0CiAgICBjcmVhdGVkX2x0OnVpbnQ2NCBjcmVhdGVkX2F0OnVpbnQzMiA9IENvbW1vbk1zZ0luZm9SZWxheGVkOwogIGBgYAogIEEgZGVzZXJpYWxpemVk" + + "IGBNc2dBZGRyZXNzYCBpcyByZXByZXNlbnRlZCBieSBhIHR1cGxlIGB0YCBhcyBmb2xsb3dzOgoKICAtIGBhZGRyX25vbmVgIGlzIHJlcHJlc2VudGVkIGJ5IGB0ID0g" + + "KDApYCwKICAgIGkuZS4sIGEgdHVwbGUgY29udGFpbmluZyBleGFjdGx5IG9uZSBpbnRlZ2VyIGVxdWFsIHRvIHplcm8uCiAgLSBgYWRkcl9leHRlcm5gIGlzIHJlcHJl" + + "c2VudGVkIGJ5IGB0ID0gKDEsIHMpYCwKICAgIHdoZXJlIHNsaWNlIGBzYCBjb250YWlucyB0aGUgZmllbGQgYGV4dGVybmFsX2FkZHJlc3NgLiBJbiBvdGhlciB3b3Jk" + + "cywgYAogICAgdGAgaXMgYSBwYWlyIChhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgdHdvIGVudHJpZXMpLCBjb250YWluaW5nIGFuIGludGVnZXIgZXF1YWwgdG8gb25lIGFu" + + "ZCBzbGljZSBgc2AuCiAgLSBgYWRkcl9zdGRgIGlzIHJlcHJlc2VudGVkIGJ5IGB0ID0gKDIsIHUsIHgsIHMpYCwKICAgIHdoZXJlIGB1YCBpcyBlaXRoZXIgYSBgbnVs" + + "bGAgKGlmIGBhbnljYXN0YCBpcyBhYnNlbnQpIG9yIGEgc2xpY2UgYHMnYCBjb250YWluaW5nIGByZXdyaXRlX3BmeGAgKGlmIGFueWNhc3QgaXMgcHJlc2VudCkuCiAg" + + "ICBOZXh0LCBpbnRlZ2VyIGB4YCBpcyB0aGUgYHdvcmtjaGFpbl9pZGAsIGFuZCBzbGljZSBgc2AgY29udGFpbnMgdGhlIGFkZHJlc3MuCiAgLSBgYWRkcl92YXJgIGlz" + + "IHJlcHJlc2VudGVkIGJ5IGB0ID0gKDMsIHUsIHgsIHMpYCwKICAgIHdoZXJlIGB1YCwgYHhgLCBhbmQgYHNgIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3IgYGFk" + + "ZHJfc3RkYC4KLX0KCjs7OyBMb2FkcyBmcm9tIHNsaWNlIFtzXSB0aGUgb25seSBwcmVmaXggdGhhdCBpcyBhIHZhbGlkIGBNc2dBZGRyZXNzYCwKOzs7IGFuZCByZXR1" + + "cm5zIGJvdGggdGhpcyBwcmVmaXggYHMnYCBhbmQgdGhlIHJlbWFpbmRlciBgcycnYCBvZiBbc10gYXMgc2xpY2VzLgooc2xpY2UsIHNsaWNlKSBsb2FkX21zZ19hZGRy" + + "KHNsaWNlIHMpIGFzbSgtPiAxIDApICJMRE1TR0FERFIiOwoKOzs7IERlY29tcG9zZXMgc2xpY2UgW3NdIGNvbnRhaW5pbmcgYSB2YWxpZCBgTXNnQWRkcmVzc2AgaW50" + + "byBhIGB0dXBsZSB0YCB3aXRoIHNlcGFyYXRlIGZpZWxkcyBvZiB0aGlzIGBNc2dBZGRyZXNzYC4KOzs7IElmIFtzXSBpcyBub3QgYSB2YWxpZCBgTXNnQWRkcmVzc2As" + + "IGEgY2VsbCBkZXNlcmlhbGl6YXRpb24gZXhjZXB0aW9uIGlzIHRocm93bi4KdHVwbGUgcGFyc2VfYWRkcihzbGljZSBzKSBhc20gIlBBUlNFTVNHQUREUiI7Cgo7Ozsg" + + "UGFyc2VzIHNsaWNlIFtzXSBjb250YWluaW5nIGEgdmFsaWQgYE1zZ0FkZHJlc3NJbnRgICh1c3VhbGx5IGEgYG1zZ19hZGRyX3N0ZGApLAo7OzsgYXBwbGllcyByZXdy" + + "aXRpbmcgZnJvbSB0aGUgYW55Y2FzdCAoaWYgcHJlc2VudCkgdG8gdGhlIHNhbWUtbGVuZ3RoIHByZWZpeCBvZiB0aGUgYWRkcmVzcywKOzs7IGFuZCByZXR1cm5zIGJv" + + "dGggdGhlIHdvcmtjaGFpbiBhbmQgdGhlIDI1Ni1iaXQgYWRkcmVzcyBhcyBpbnRlZ2Vycy4KOzs7IElmIHRoZSBhZGRyZXNzIGlzIG5vdCAyNTYtYml0LCBvciBpZiBb" + + "c10gaXMgbm90IGEgdmFsaWQgc2VyaWFsaXphdGlvbiBvZiBgTXNnQWRkcmVzc0ludGAsCjs7OyB0aHJvd3MgYSBjZWxsIGRlc2VyaWFsaXphdGlvbiBleGNlcHRpb24u" + + "CihpbnQsIGludCkgcGFyc2Vfc3RkX2FkZHIoc2xpY2UgcykgYXNtICJSRVdSSVRFU1REQUREUiI7Cgo7OzsgQSB2YXJpYW50IG9mIFtwYXJzZV9zdGRfYWRkcl0gdGhh" + + "dCByZXR1cm5zIHRoZSAocmV3cml0dGVuKSBhZGRyZXNzIGFzIGEgc2xpY2UgW3NdLAo7OzsgZXZlbiBpZiBpdCBpcyBub3QgZXhhY3RseSAyNTYgYml0IGxvbmcgKHJl" + + "cHJlc2VudGVkIGJ5IGEgYG1zZ19hZGRyX3ZhcmApLgooaW50LCBzbGljZSkgcGFyc2VfdmFyX2FkZHIoc2xpY2UgcykgYXNtICJSRVdSSVRFVkFSQUREUiI7Cgp7LQog" + + "ICMgRGljdGlvbmFyeSBwcmltaXRpdmVzCi19CgoKOzs7IFNldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBba2V5X2xlbl0tYml0IGtleSBzaWduZWQgaW5kZXgg" + + "aW4gZGljdGlvbmFyeSBbZGljdF0gdG8gW3ZhbHVlXSAoY2VsbCksCjs7OyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIGRpY3Rpb25hcnkuCmNlbGwgaWRpY3Rfc2V0" + + "X3JlZihjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIGNlbGwgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVNFVFJFRiI7" + + "CihjZWxsLCAoKSkgfmlkaWN0X3NldF9yZWYoY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBjZWxsIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBr" + + "ZXlfbGVuKSAiRElDVElTRVRSRUYiOwoKOzs7IFNldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBba2V5X2xlbl0tYml0IGtleSB1bnNpZ25lZCBpbmRleCBpbiBk" + + "aWN0aW9uYXJ5IFtkaWN0XSB0byBbdmFsdWVdIChjZWxsKSwKOzs7IGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgZGljdGlvbmFyeS4KY2VsbCB1ZGljdF9zZXRfcmVm" + + "KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgY2VsbCB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVU0VUUkVGIjsKKGNl" + + "bGwsICgpKSB+dWRpY3Rfc2V0X3JlZihjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIGNlbGwgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9s" + + "ZW4pICJESUNUVVNFVFJFRiI7CgpjZWxsIGlkaWN0X2dldF9yZWYoY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4KSBhc20oaW5kZXggZGljdCBrZXlfbGVu" + + "KSAiRElDVElHRVRPUFRSRUYiOwooY2VsbCwgaW50KSBpZGljdF9nZXRfcmVmPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgpIGFzbShpbmRleCBkaWN0" + + "IGtleV9sZW4pICJESUNUSUdFVFJFRiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgaW50KSB1ZGljdF9nZXRfcmVmPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQg" + + "aW5kZXgpIGFzbShpbmRleCBkaWN0IGtleV9sZW4pICJESUNUVUdFVFJFRiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgY2VsbCkgaWRpY3Rfc2V0X2dldF9yZWYoY2Vs" + + "bCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBjZWxsIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVElTRVRHRVRPUFRSRUYiOwoo" + + "Y2VsbCwgY2VsbCkgdWRpY3Rfc2V0X2dldF9yZWYoY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBjZWxsIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGlj" + + "dCBrZXlfbGVuKSAiRElDVFVTRVRHRVRPUFRSRUYiOwooY2VsbCwgaW50KSBpZGljdF9kZWxldGU/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCkgYXNt" + + "KGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RJREVMIjsKKGNlbGwsIGludCkgdWRpY3RfZGVsZXRlPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgpIGFz" + + "bShpbmRleCBkaWN0IGtleV9sZW4pICJESUNUVURFTCI7CihzbGljZSwgaW50KSBpZGljdF9nZXQ/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCkgYXNt" + + "KGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RJR0VUIiAiTlVMTFNXQVBJRk5PVCI7CihzbGljZSwgaW50KSB1ZGljdF9nZXQ/KGNlbGwgZGljdCwgaW50IGtleV9sZW4s" + + "IGludCBpbmRleCkgYXNtKGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVR0VUIiAiTlVMTFNXQVBJRk5PVCI7CihjZWxsLCBzbGljZSwgaW50KSBpZGljdF9kZWxldGVf" + + "Z2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgpIGFzbShpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSURFTEdFVCIgIk5VTExTV0FQSUZOT1QiOwoo" + + "Y2VsbCwgc2xpY2UsIGludCkgdWRpY3RfZGVsZXRlX2dldD8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4KSBhc20oaW5kZXggZGljdCBrZXlfbGVuKSAi" + + "RElDVFVERUxHRVQiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIChzbGljZSwgaW50KSkgfmlkaWN0X2RlbGV0ZV9nZXQ/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGlu" + + "dCBpbmRleCkgYXNtKGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RJREVMR0VUIiAiTlVMTFNXQVBJRk5PVCI7CihjZWxsLCAoc2xpY2UsIGludCkpIH51ZGljdF9kZWxl" + + "dGVfZ2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgpIGFzbShpbmRleCBkaWN0IGtleV9sZW4pICJESUNUVURFTEdFVCIgIk5VTExTV0FQSUZOT1Qi" + + "OwooY2VsbCwgY2VsbCwgaW50KSBpZGljdF9kZWxldGVfZ2V0X3JlZj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4KSBhc20oaW5kZXggZGljdCBrZXlf" + + "bGVuKSAiRElDVElERUxHRVRSRUYiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIGNlbGwsIGludCkgdWRpY3RfZGVsZXRlX2dldF9yZWY/KGNlbGwgZGljdCwgaW50IGtl" + + "eV9sZW4sIGludCBpbmRleCkgYXNtKGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVREVMR0VUUkVGIiAiTlVMTFNXQVBJRk5PVCI7CihjZWxsLCAoY2VsbCwgaW50KSkg" + + "fmlkaWN0X2RlbGV0ZV9nZXRfcmVmPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgpIGFzbShpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSURFTEdFVFJF" + + "RiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgKGNlbGwsIGludCkpIH51ZGljdF9kZWxldGVfZ2V0X3JlZj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4" + + "KSBhc20oaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVERUxHRVRSRUYiICJOVUxMU1dBUElGTk9UIjsKY2VsbCB1ZGljdF9zZXQoY2VsbCBkaWN0LCBpbnQga2V5X2xl" + + "biwgaW50IGluZGV4LCBzbGljZSB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVU0VUIjsKKGNlbGwsICgpKSB+dWRpY3Rfc2V0KGNlbGwg" + + "ZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUVVNFVCI7CmNlbGwgaWRpY3Rf" + + "c2V0KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVNFVCI7Cihj" + + "ZWxsLCAoKSkgfmlkaWN0X3NldChjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIHNsaWNlIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVu" + + "KSAiRElDVElTRVQiOwpjZWxsIGRpY3Rfc2V0KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIHNsaWNlIGluZGV4LCBzbGljZSB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRp" + + "Y3Qga2V5X2xlbikgIkRJQ1RTRVQiOwooY2VsbCwgKCkpIH5kaWN0X3NldChjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGljZSBpbmRleCwgc2xpY2UgdmFsdWUpIGFz" + + "bSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUU0VUIjsKKGNlbGwsIGludCkgdWRpY3RfYWRkPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgs" + + "IHNsaWNlIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVBREQiOwooY2VsbCwgaW50KSB1ZGljdF9yZXBsYWNlPyhjZWxsIGRpY3QsIGlu" + + "dCBrZXlfbGVuLCBpbnQgaW5kZXgsIHNsaWNlIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVSRVBMQUNFIjsKKGNlbGwsIGludCkgdWRp" + + "Y3RfcmVwbGFjZV9yZWY/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgY2VsbCB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJ" + + "Q1RVUkVQTEFDRVJFRiI7CihjZWxsLCBzbGljZSwgaW50KSB1ZGljdF9yZXBsYWNlZ2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIHNsaWNlIHZh" + + "bHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVSRVBMQUNFR0VUIiAiTlVMTFNXQVBJRk5PVCI7CihjZWxsLCBjZWxsLCBpbnQpIHVkaWN0X3Jl" + + "cGxhY2VnZXRfcmVmPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIGNlbGwgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNU" + + "VVJFUExBQ0VHRVRSRUYiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIChzbGljZSwgaW50KSkgfnVkaWN0X3JlcGxhY2VnZXQ/KGNlbGwgZGljdCwgaW50IGtleV9sZW4s" + + "IGludCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUVVJFUExBQ0VHRVQiICJOVUxMU1dBUElGTk9UIjsKKGNlbGws" + + "IChjZWxsLCBpbnQpKSB+dWRpY3RfcmVwbGFjZWdldF9yZWY/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgY2VsbCB2YWx1ZSkgYXNtKHZhbHVlIGlu" + + "ZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVUkVQTEFDRUdFVFJFRiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgaW50KSBpZGljdF9hZGQ/KGNlbGwgZGljdCwgaW50IGtl" + + "eV9sZW4sIGludCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSUFERCI7CihjZWxsLCBpbnQpIGlkaWN0X3JlcGxh" + + "Y2U/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVJFUExBQ0Ui" + + "OwooY2VsbCwgaW50KSBpZGljdF9yZXBsYWNlX3JlZj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBjZWxsIHZhbHVlKSBhc20odmFsdWUgaW5kZXgg" + + "ZGljdCBrZXlfbGVuKSAiRElDVElSRVBMQUNFUkVGIjsKKGNlbGwsIHNsaWNlLCBpbnQpIGlkaWN0X3JlcGxhY2VnZXQ/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGlu" + + "dCBpbmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVJFUExBQ0VHRVQiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIGNl" + + "bGwsIGludCkgaWRpY3RfcmVwbGFjZWdldF9yZWY/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgY2VsbCB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRp" + + "Y3Qga2V5X2xlbikgIkRJQ1RJUkVQTEFDRUdFVFJFRiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgKHNsaWNlLCBpbnQpKSB+aWRpY3RfcmVwbGFjZWdldD8oY2VsbCBk" + + "aWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBzbGljZSB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RJUkVQTEFDRUdFVCIgIk5VTExT" + + "V0FQSUZOT1QiOwooY2VsbCwgKGNlbGwsIGludCkpIH5pZGljdF9yZXBsYWNlZ2V0X3JlZj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBjZWxsIHZh" + + "bHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVElSRVBMQUNFR0VUUkVGIiAiTlVMTFNXQVBJRk5PVCI7CmNlbGwgdWRpY3Rfc2V0X2J1aWxkZXIo" + + "Y2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVTRVRCIjsKKGNl" + + "bGwsICgpKSB+dWRpY3Rfc2V0X2J1aWxkZXIoY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGlj" + + "dCBrZXlfbGVuKSAiRElDVFVTRVRCIjsKY2VsbCBpZGljdF9zZXRfYnVpbGRlcihjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgaW5kZXgsIGJ1aWxkZXIgdmFsdWUp" + + "IGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVNFVEIiOwooY2VsbCwgKCkpIH5pZGljdF9zZXRfYnVpbGRlcihjZWxsIGRpY3QsIGludCBrZXlfbGVu" + + "LCBpbnQgaW5kZXgsIGJ1aWxkZXIgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUSVNFVEIiOwpjZWxsIGRpY3Rfc2V0X2J1aWxkZXIoY2Vs" + + "bCBkaWN0LCBpbnQga2V5X2xlbiwgc2xpY2UgaW5kZXgsIGJ1aWxkZXIgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUU0VUQiI7CihjZWxs" + + "LCAoKSkgfmRpY3Rfc2V0X2J1aWxkZXIoY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgc2xpY2UgaW5kZXgsIGJ1aWxkZXIgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0" + + "IGtleV9sZW4pICJESUNUU0VUQiI7CihjZWxsLCBpbnQpIGRpY3RfcmVwbGFjZV9idWlsZGVyPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGljZSBpbmRleCwgYnVp" + + "bGRlciB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RSRVBMQUNFQiI7CihjZWxsLCBidWlsZGVyLCBpbnQpIGRpY3RfcmVwbGFjZWdldF9i" + + "dWlsZGVyPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGljZSBpbmRleCwgYnVpbGRlciB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RS" + + "RVBMQUNFR0VUQiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgc2xpY2UsIGludCkgZGljdF9yZXBsYWNlZ2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGljZSBp" + + "bmRleCwgc2xpY2UgdmFsdWUpIGFzbSh2YWx1ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUUkVQTEFDRUdFVCIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgKGJ1aWxk" + + "ZXIsIGludCkpIH5kaWN0X3JlcGxhY2VnZXRfYnVpbGRlcj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgc2xpY2UgaW5kZXgsIGJ1aWxkZXIgdmFsdWUpIGFzbSh2YWx1" + + "ZSBpbmRleCBkaWN0IGtleV9sZW4pICJESUNUUkVQTEFDRUdFVEIiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIChzbGljZSwgaW50KSkgfmRpY3RfcmVwbGFjZWdldD8o" + + "Y2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgc2xpY2UgaW5kZXgsIHNsaWNlIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFJFUExBQ0VHRVQi" + + "ICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIGludCkgdWRpY3RfYWRkX2J1aWxkZXI/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgYnVpbGRlciB2YWx1" + + "ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVQUREQiI7CihjZWxsLCBpbnQpIHVkaWN0X3JlcGxhY2VfYnVpbGRlcj8oY2VsbCBkaWN0LCBpbnQg" + + "a2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVFVSRVBMQUNFQiI7CihjZWxsLCBidWlsZGVy" + + "LCBpbnQpIHVkaWN0X3JlcGxhY2VnZXRfYnVpbGRlcj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20odmFsdWUgaW5k" + + "ZXggZGljdCBrZXlfbGVuKSAiRElDVFVSRVBMQUNFR0VUQiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgKGJ1aWxkZXIsIGludCkpIH51ZGljdF9yZXBsYWNlZ2V0X2J1" + + "aWxkZXI/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgYnVpbGRlciB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RVUkVQ" + + "TEFDRUdFVEIiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIGludCkgaWRpY3RfYWRkX2J1aWxkZXI/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgYnVp" + + "bGRlciB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikgIkRJQ1RJQUREQiI7CihjZWxsLCBpbnQpIGlkaWN0X3JlcGxhY2VfYnVpbGRlcj8oY2VsbCBk" + + "aWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20odmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVElSRVBMQUNFQiI7CihjZWxs" + + "LCBidWlsZGVyLCBpbnQpIGlkaWN0X3JlcGxhY2VnZXRfYnVpbGRlcj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IGluZGV4LCBidWlsZGVyIHZhbHVlKSBhc20o" + + "dmFsdWUgaW5kZXggZGljdCBrZXlfbGVuKSAiRElDVElSRVBMQUNFR0VUQiIgIk5VTExTV0FQSUZOT1QiOwooY2VsbCwgKGJ1aWxkZXIsIGludCkpIH5pZGljdF9yZXBs" + + "YWNlZ2V0X2J1aWxkZXI/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBpbmRleCwgYnVpbGRlciB2YWx1ZSkgYXNtKHZhbHVlIGluZGV4IGRpY3Qga2V5X2xlbikg" + + "IkRJQ1RJUkVQTEFDRUdFVEIiICJOVUxMU1dBUElGTk9UIjsKKGNlbGwsIGludCwgc2xpY2UsIGludCkgdWRpY3RfZGVsZXRlX2dldF9taW4oY2VsbCBkaWN0LCBpbnQg" + + "a2V5X2xlbikgYXNtKC0+IDAgMiAxIDMpICJESUNUVVJFTU1JTiIgIk5VTExTV0FQSUZOT1QyIjsKKGNlbGwsIChpbnQsIHNsaWNlLCBpbnQpKSB+dWRpY3Q6OmRlbGV0" + + "ZV9nZXRfbWluKGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSgtPiAwIDIgMSAzKSAiRElDVFVSRU1NSU4iICJOVUxMU1dBUElGTk9UMiI7CihjZWxsLCBpbnQsIHNs" + + "aWNlLCBpbnQpIGlkaWN0X2RlbGV0ZV9nZXRfbWluKGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSgtPiAwIDIgMSAzKSAiRElDVElSRU1NSU4iICJOVUxMU1dBUElG" + + "Tk9UMiI7CihjZWxsLCAoaW50LCBzbGljZSwgaW50KSkgfmlkaWN0OjpkZWxldGVfZ2V0X21pbihjZWxsIGRpY3QsIGludCBrZXlfbGVuKSBhc20oLT4gMCAyIDEgMykg" + + "IkRJQ1RJUkVNTUlOIiAiTlVMTFNXQVBJRk5PVDIiOwooY2VsbCwgc2xpY2UsIHNsaWNlLCBpbnQpIGRpY3RfZGVsZXRlX2dldF9taW4oY2VsbCBkaWN0LCBpbnQga2V5" + + "X2xlbikgYXNtKC0+IDAgMiAxIDMpICJESUNUUkVNTUlOIiAiTlVMTFNXQVBJRk5PVDIiOwooY2VsbCwgKHNsaWNlLCBzbGljZSwgaW50KSkgfmRpY3Q6OmRlbGV0ZV9n" + + "ZXRfbWluKGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSgtPiAwIDIgMSAzKSAiRElDVFJFTU1JTiIgIk5VTExTV0FQSUZOT1QyIjsKKGNlbGwsIGludCwgc2xpY2Us" + + "IGludCkgdWRpY3RfZGVsZXRlX2dldF9tYXgoY2VsbCBkaWN0LCBpbnQga2V5X2xlbikgYXNtKC0+IDAgMiAxIDMpICJESUNUVVJFTU1BWCIgIk5VTExTV0FQSUZOT1Qy" + + "IjsKKGNlbGwsIChpbnQsIHNsaWNlLCBpbnQpKSB+dWRpY3Q6OmRlbGV0ZV9nZXRfbWF4KGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSgtPiAwIDIgMSAzKSAiRElD" + + "VFVSRU1NQVgiICJOVUxMU1dBUElGTk9UMiI7CihjZWxsLCBpbnQsIHNsaWNlLCBpbnQpIGlkaWN0X2RlbGV0ZV9nZXRfbWF4KGNlbGwgZGljdCwgaW50IGtleV9sZW4p" + + "IGFzbSgtPiAwIDIgMSAzKSAiRElDVElSRU1NQVgiICJOVUxMU1dBUElGTk9UMiI7CihjZWxsLCAoaW50LCBzbGljZSwgaW50KSkgfmlkaWN0OjpkZWxldGVfZ2V0X21h" + + "eChjZWxsIGRpY3QsIGludCBrZXlfbGVuKSBhc20oLT4gMCAyIDEgMykgIkRJQ1RJUkVNTUFYIiAiTlVMTFNXQVBJRk5PVDIiOwooY2VsbCwgc2xpY2UsIHNsaWNlLCBp" + + "bnQpIGRpY3RfZGVsZXRlX2dldF9tYXgoY2VsbCBkaWN0LCBpbnQga2V5X2xlbikgYXNtKC0+IDAgMiAxIDMpICJESUNUUkVNTUFYIiAiTlVMTFNXQVBJRk5PVDIiOwoo" + + "Y2VsbCwgKHNsaWNlLCBzbGljZSwgaW50KSkgfmRpY3Q6OmRlbGV0ZV9nZXRfbWF4KGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSgtPiAwIDIgMSAzKSAiRElDVFJF" + + "TU1BWCIgIk5VTExTV0FQSUZOT1QyIjsKKGludCwgc2xpY2UsIGludCkgdWRpY3RfZ2V0X21pbj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbikgYXNtICgtPiAxIDAgMikg" + + "IkRJQ1RVTUlOIiAiTlVMTFNXQVBJRk5PVDIiOwooaW50LCBzbGljZSwgaW50KSB1ZGljdF9nZXRfbWF4PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuKSBhc20gKC0+IDEg" + + "MCAyKSAiRElDVFVNQVgiICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIGNlbGwsIGludCkgdWRpY3RfZ2V0X21pbl9yZWY/KGNlbGwgZGljdCwgaW50IGtleV9sZW4pIGFz" + + "bSAoLT4gMSAwIDIpICJESUNUVU1JTlJFRiIgIk5VTExTV0FQSUZOT1QyIjsKKGludCwgY2VsbCwgaW50KSB1ZGljdF9nZXRfbWF4X3JlZj8oY2VsbCBkaWN0LCBpbnQg" + + "a2V5X2xlbikgYXNtICgtPiAxIDAgMikgIkRJQ1RVTUFYUkVGIiAiTlVMTFNXQVBJRk5PVDIiOwooaW50LCBzbGljZSwgaW50KSBpZGljdF9nZXRfbWluPyhjZWxsIGRp" + + "Y3QsIGludCBrZXlfbGVuKSBhc20gKC0+IDEgMCAyKSAiRElDVElNSU4iICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIHNsaWNlLCBpbnQpIGlkaWN0X2dldF9tYXg/KGNl" + + "bGwgZGljdCwgaW50IGtleV9sZW4pIGFzbSAoLT4gMSAwIDIpICJESUNUSU1BWCIgIk5VTExTV0FQSUZOT1QyIjsKKGludCwgY2VsbCwgaW50KSBpZGljdF9nZXRfbWlu" + + "X3JlZj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbikgYXNtICgtPiAxIDAgMikgIkRJQ1RJTUlOUkVGIiAiTlVMTFNXQVBJRk5PVDIiOwooaW50LCBjZWxsLCBpbnQpIGlk" + + "aWN0X2dldF9tYXhfcmVmPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuKSBhc20gKC0+IDEgMCAyKSAiRElDVElNQVhSRUYiICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIHNs" + + "aWNlLCBpbnQpIHVkaWN0X2dldF9uZXh0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgcGl2b3QpIGFzbShwaXZvdCBkaWN0IGtleV9sZW4gLT4gMSAwIDIpICJE" + + "SUNUVUdFVE5FWFQiICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIHNsaWNlLCBpbnQpIHVkaWN0X2dldF9uZXh0ZXE/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBw" + + "aXZvdCkgYXNtKHBpdm90IGRpY3Qga2V5X2xlbiAtPiAxIDAgMikgIkRJQ1RVR0VUTkVYVEVRIiAiTlVMTFNXQVBJRk5PVDIiOwooaW50LCBzbGljZSwgaW50KSB1ZGlj" + + "dF9nZXRfcHJldj8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IHBpdm90KSBhc20ocGl2b3QgZGljdCBrZXlfbGVuIC0+IDEgMCAyKSAiRElDVFVHRVRQUkVWIiAi" + + "TlVMTFNXQVBJRk5PVDIiOwooaW50LCBzbGljZSwgaW50KSB1ZGljdF9nZXRfcHJldmVxPyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBpbnQgcGl2b3QpIGFzbShwaXZv" + + "dCBkaWN0IGtleV9sZW4gLT4gMSAwIDIpICJESUNUVUdFVFBSRVZFUSIgIk5VTExTV0FQSUZOT1QyIjsKKGludCwgc2xpY2UsIGludCkgaWRpY3RfZ2V0X25leHQ/KGNl" + + "bGwgZGljdCwgaW50IGtleV9sZW4sIGludCBwaXZvdCkgYXNtKHBpdm90IGRpY3Qga2V5X2xlbiAtPiAxIDAgMikgIkRJQ1RJR0VUTkVYVCIgIk5VTExTV0FQSUZOT1Qy" + + "IjsKKGludCwgc2xpY2UsIGludCkgaWRpY3RfZ2V0X25leHRlcT8oY2VsbCBkaWN0LCBpbnQga2V5X2xlbiwgaW50IHBpdm90KSBhc20ocGl2b3QgZGljdCBrZXlfbGVu" + + "IC0+IDEgMCAyKSAiRElDVElHRVRORVhURVEiICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIHNsaWNlLCBpbnQpIGlkaWN0X2dldF9wcmV2PyhjZWxsIGRpY3QsIGludCBr" + + "ZXlfbGVuLCBpbnQgcGl2b3QpIGFzbShwaXZvdCBkaWN0IGtleV9sZW4gLT4gMSAwIDIpICJESUNUSUdFVFBSRVYiICJOVUxMU1dBUElGTk9UMiI7CihpbnQsIHNsaWNl" + + "LCBpbnQpIGlkaWN0X2dldF9wcmV2ZXE/KGNlbGwgZGljdCwgaW50IGtleV9sZW4sIGludCBwaXZvdCkgYXNtKHBpdm90IGRpY3Qga2V5X2xlbiAtPiAxIDAgMikgIkRJ" + + "Q1RJR0VUUFJFVkVRIiAiTlVMTFNXQVBJRk5PVDIiOwoKOzs7IENyZWF0ZXMgYW4gZW1wdHkgZGljdGlvbmFyeSwgd2hpY2ggaXMgYWN0dWFsbHkgYSBudWxsIHZhbHVl" + + "LiBFcXVpdmFsZW50IHRvIFBVU0hOVUxMCmNlbGwgbmV3X2RpY3QoKSBhc20gIk5FV0RJQ1QiOwo7OzsgQ2hlY2tzIHdoZXRoZXIgYSBkaWN0aW9uYXJ5IGlzIGVtcHR5" + + "LiBFcXVpdmFsZW50IHRvIGNlbGxfbnVsbD8uCmludCBkaWN0X2VtcHR5PyhjZWxsIGMpIGFzbSAiRElDVEVNUFRZIjsKCgp7LSBQcmVmaXggZGljdGlvbmFyeSBwcmlt" + + "aXRpdmVzIC19CihzbGljZSwgc2xpY2UsIHNsaWNlLCBpbnQpIHBmeGRpY3RfZ2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGljZSBrZXkpIGFzbShrZXkgZGlj" + + "dCBrZXlfbGVuKSAiUEZYRElDVEdFVFEiICJOVUxMU1dBUElGTk9UMiI7CihjZWxsLCBpbnQpIHBmeGRpY3Rfc2V0PyhjZWxsIGRpY3QsIGludCBrZXlfbGVuLCBzbGlj" + + "ZSBrZXksIHNsaWNlIHZhbHVlKSBhc20odmFsdWUga2V5IGRpY3Qga2V5X2xlbikgIlBGWERJQ1RTRVQiOwooY2VsbCwgaW50KSBwZnhkaWN0X2RlbGV0ZT8oY2VsbCBk" + + "aWN0LCBpbnQga2V5X2xlbiwgc2xpY2Uga2V5KSBhc20oa2V5IGRpY3Qga2V5X2xlbikgIlBGWERJQ1RERUwiOwoKOzs7IFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBn" + + "bG9iYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgd2l0aCBpbnRlZ2VyIGluZGV4IGBpYCBhcyBhIGBjZWxsYCBvciBgbnVsbGAgdmFsdWUuCmNlbGwgY29uZmlnX3Bh" + + "cmFtKGludCB4KSBhc20gIkNPTkZJR09QVFBBUkFNIjsKOzs7IENoZWNrcyB3aGV0aGVyIGMgaXMgYSBudWxsLiBOb3RlLCB0aGF0IEZ1bkMgYWxzbyBoYXMgcG9seW1v" + + "cnBoaWMgbnVsbD8gYnVpbHQtaW4uCmludCBjZWxsX251bGw/KGNlbGwgYykgYXNtICJJU05VTEwiOwoKOzs7IENyZWF0ZXMgYW4gb3V0cHV0IGFjdGlvbiB3aGljaCB3" + + "b3VsZCByZXNlcnZlIGV4YWN0bHkgYW1vdW50IG5hbm90b25jb2lucyAoaWYgbW9kZSA9IDApLCBhdCBtb3N0IGFtb3VudCBuYW5vdG9uY29pbnMgKGlmIG1vZGUgPSAy" + + "KSwgb3IgYWxsIGJ1dCBhbW91bnQgbmFub3RvbmNvaW5zIChpZiBtb2RlID0gMSBvciBtb2RlID0gMyksIGZyb20gdGhlIHJlbWFpbmluZyBiYWxhbmNlIG9mIHRoZSBh" + + "Y2NvdW50LiBJdCBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gY3JlYXRpbmcgYW4gb3V0Ym91bmQgbWVzc2FnZSBjYXJyeWluZyBhbW91bnQgbmFub3RvbmNvaW5zIChv" + + "ciBiIOKIkiBhbW91bnQgbmFub3RvbmNvaW5zLCB3aGVyZSBiIGlzIHRoZSByZW1haW5pbmcgYmFsYW5jZSkgdG8gb25lc2VsZiwgc28gdGhhdCB0aGUgc3Vic2VxdWVu" + + "dCBvdXRwdXQgYWN0aW9ucyB3b3VsZCBub3QgYmUgYWJsZSB0byBzcGVuZCBtb3JlIG1vbmV5IHRoYW4gdGhlIHJlbWFpbmRlci4gQml0ICsyIGluIG1vZGUgbWVhbnMg" + + "dGhhdCB0aGUgZXh0ZXJuYWwgYWN0aW9uIGRvZXMgbm90IGZhaWwgaWYgdGhlIHNwZWNpZmllZCBhbW91bnQgY2Fubm90IGJlIHJlc2VydmVkOyBpbnN0ZWFkLCBhbGwg" + + "cmVtYWluaW5nIGJhbGFuY2UgaXMgcmVzZXJ2ZWQuIEJpdCArOCBpbiBtb2RlIG1lYW5zIGBhbW91bnQgPC0gLWFtb3VudGAgYmVmb3JlIHBlcmZvcm1pbmcgYW55IGZ1" + + "cnRoZXIgYWN0aW9ucy4gQml0ICs0IGluIG1vZGUgbWVhbnMgdGhhdCBhbW91bnQgaXMgaW5jcmVhc2VkIGJ5IHRoZSBvcmlnaW5hbCBiYWxhbmNlIG9mIHRoZSBjdXJy" + + "ZW50IGFjY291bnQgKGJlZm9yZSB0aGUgY29tcHV0ZSBwaGFzZSksIGluY2x1ZGluZyBhbGwgZXh0cmEgY3VycmVuY2llcywgYmVmb3JlIHBlcmZvcm1pbmcgYW55IG90" + + "aGVyIGNoZWNrcyBhbmQgYWN0aW9ucy4gQ3VycmVudGx5LCBhbW91bnQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBhbmQgbW9kZSBtdXN0IGJlIGluIHRo" + + "ZSByYW5nZSAwLi4xNS4KKCkgcmF3X3Jlc2VydmUoaW50IGFtb3VudCwgaW50IG1vZGUpIGltcHVyZSBhc20gIlJBV1JFU0VSVkUiOwo7OzsgU2ltaWxhciB0byByYXdf" + + "cmVzZXJ2ZSwgYnV0IGFsc28gYWNjZXB0cyBhIGRpY3Rpb25hcnkgZXh0cmFfYW1vdW50IChyZXByZXNlbnRlZCBieSBhIGNlbGwgb3IgbnVsbCkgd2l0aCBleHRyYSBj" + + "dXJyZW5jaWVzLiBJbiB0aGlzIHdheSBjdXJyZW5jaWVzIG90aGVyIHRoYW4gVG9uQ29pbiBjYW4gYmUgcmVzZXJ2ZWQuCigpIHJhd19yZXNlcnZlX2V4dHJhKGludCBh" + + "bW91bnQsIGNlbGwgZXh0cmFfYW1vdW50LCBpbnQgbW9kZSkgaW1wdXJlIGFzbSAiUkFXUkVTRVJWRVgiOwo7OzsgU2VuZHMgYSByYXcgbWVzc2FnZSBjb250YWluZWQg" + + "aW4gbXNnLCB3aGljaCBzaG91bGQgY29udGFpbiBhIGNvcnJlY3RseSBzZXJpYWxpemVkIG9iamVjdCBNZXNzYWdlIFgsIHdpdGggdGhlIG9ubHkgZXhjZXB0aW9uIHRo" + + "YXQgdGhlIHNvdXJjZSBhZGRyZXNzIGlzIGFsbG93ZWQgdG8gaGF2ZSBkdW1teSB2YWx1ZSBhZGRyX25vbmUgKHRvIGJlIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0" + + "aCB0aGUgY3VycmVudCBzbWFydCBjb250cmFjdCBhZGRyZXNzKSwgYW5kIGlocl9mZWUsIGZ3ZF9mZWUsIGNyZWF0ZWRfbHQgYW5kIGNyZWF0ZWRfYXQgZmllbGRzIGNh" + + "biBoYXZlIGFyYml0cmFyeSB2YWx1ZXMgKHRvIGJlIHJld3JpdHRlbiB3aXRoIGNvcnJlY3QgdmFsdWVzIGR1cmluZyB0aGUgYWN0aW9uIHBoYXNlIG9mIHRoZSBjdXJy" + + "ZW50IHRyYW5zYWN0aW9uKS4gSW50ZWdlciBwYXJhbWV0ZXIgbW9kZSBjb250YWlucyB0aGUgZmxhZ3MuIEN1cnJlbnRseSBtb2RlID0gMCBpcyB1c2VkIGZvciBvcmRp" + + "bmFyeSBtZXNzYWdlczsgbW9kZSA9IDEyOCBpcyB1c2VkIGZvciBtZXNzYWdlcyB0aGF0IGFyZSB0byBjYXJyeSBhbGwgdGhlIHJlbWFpbmluZyBiYWxhbmNlIG9mIHRo" + + "ZSBjdXJyZW50IHNtYXJ0IGNvbnRyYWN0IChpbnN0ZWFkIG9mIHRoZSB2YWx1ZSBvcmlnaW5hbGx5IGluZGljYXRlZCBpbiB0aGUgbWVzc2FnZSk7IG1vZGUgPSA2NCBp" + + "cyB1c2VkIGZvciBtZXNzYWdlcyB0aGF0IGNhcnJ5IGFsbCB0aGUgcmVtYWluaW5nIHZhbHVlIG9mIHRoZSBpbmJvdW5kIG1lc3NhZ2UgaW4gYWRkaXRpb24gdG8gdGhl" + + "IHZhbHVlIGluaXRpYWxseSBpbmRpY2F0ZWQgaW4gdGhlIG5ldyBtZXNzYWdlIChpZiBiaXQgMCBpcyBub3Qgc2V0LCB0aGUgZ2FzIGZlZXMgYXJlIGRlZHVjdGVkIGZy" + + "b20gdGhpcyBhbW91bnQpOyBtb2RlJyA9IG1vZGUgKyAxIG1lYW5zIHRoYXQgdGhlIHNlbmRlciB3YW50cyB0byBwYXkgdHJhbnNmZXIgZmVlcyBzZXBhcmF0ZWx5OyBt" + + "b2RlJyA9IG1vZGUgKyAyIG1lYW5zIHRoYXQgYW55IGVycm9ycyBhcmlzaW5nIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlIGR1cmluZyB0aGUgYWN0aW9uIHBo" + + "YXNlIHNob3VsZCBiZSBpZ25vcmVkLiBGaW5hbGx5LCBtb2RlJyA9IG1vZGUgKyAzMiBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGFjY291bnQgbXVzdCBiZSBkZXN0cm95" + + "ZWQgaWYgaXRzIHJlc3VsdGluZyBiYWxhbmNlIGlzIHplcm8uIFRoaXMgZmxhZyBpcyB1c3VhbGx5IGVtcGxveWVkIHRvZ2V0aGVyIHdpdGggKzEyOC4KKCkgc2VuZF9y" + + "YXdfbWVzc2FnZShjZWxsIG1zZywgaW50IG1vZGUpIGltcHVyZSBhc20gIlNFTkRSQVdNU0ciOwo7OzsgQ3JlYXRlcyBhbiBvdXRwdXQgYWN0aW9uIHRoYXQgd291bGQg" + + "Y2hhbmdlIHRoaXMgc21hcnQgY29udHJhY3QgY29kZSB0byB0aGF0IGdpdmVuIGJ5IGNlbGwgbmV3X2NvZGUuIE5vdGljZSB0aGF0IHRoaXMgY2hhbmdlIHdpbGwgdGFr" + + "ZSBlZmZlY3Qgb25seSBhZnRlciB0aGUgc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbiBvZiB0aGUgY3VycmVudCBydW4gb2YgdGhlIHNtYXJ0IGNvbnRyYWN0CigpIHNldF9j" + + "b2RlKGNlbGwgbmV3X2NvZGUpIGltcHVyZSBhc20gIlNFVENPREUiOwoKOzs7IEdlbmVyYXRlcyBhIG5ldyBwc2V1ZG8tcmFuZG9tIHVuc2lnbmVkIDI1Ni1iaXQgaW50" + + "ZWdlciB4LiBUaGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6IGlmIHIgaXMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcmFuZG9tIHNlZWQsIGNvbnNpZGVyZWQgYXMgYSAz" + + "Mi1ieXRlIGFycmF5IChieSBjb25zdHJ1Y3RpbmcgdGhlIGJpZy1lbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgYW4gdW5zaWduZWQgMjU2LWJpdCBpbnRlZ2VyKSwgdGhl" + + "biBpdHMgc2hhNTEyKHIpIGlzIGNvbXB1dGVkOyB0aGUgZmlyc3QgMzIgYnl0ZXMgb2YgdGhpcyBoYXNoIGFyZSBzdG9yZWQgYXMgdGhlIG5ldyB2YWx1ZSByJyBvZiB0" + + "aGUgcmFuZG9tIHNlZWQsIGFuZCB0aGUgcmVtYWluaW5nIDMyIGJ5dGVzIGFyZSByZXR1cm5lZCBhcyB0aGUgbmV4dCByYW5kb20gdmFsdWUgeC4KaW50IHJhbmRvbSgp" + + "IGltcHVyZSBhc20gIlJBTkRVMjU2IjsKOzs7IEdlbmVyYXRlcyBhIG5ldyBwc2V1ZG8tcmFuZG9tIGludGVnZXIgeiBpbiB0aGUgcmFuZ2UgMC4ucmFuZ2XiiJIxIChv" + + "ciByYW5nZS4u4oiSMSwgaWYgcmFuZ2UgPCAwKS4gTW9yZSBwcmVjaXNlbHksIGFuIHVuc2lnbmVkIHJhbmRvbSB2YWx1ZSB4IGlzIGdlbmVyYXRlZCBhcyBpbiByYW5k" + + "b207IHRoZW4geiA6PSB4ICogcmFuZ2UgLyAyXjI1NiBpcyBjb21wdXRlZC4KaW50IHJhbmQoaW50IHJhbmdlKSBpbXB1cmUgYXNtICJSQU5EIjsKOzs7IFJldHVybnMg" + + "dGhlIGN1cnJlbnQgcmFuZG9tIHNlZWQgYXMgYW4gdW5zaWduZWQgMjU2LWJpdCBJbnRlZ2VyLgppbnQgZ2V0X3NlZWQoKSBpbXB1cmUgYXNtICJSQU5EU0VFRCI7Cjs7" + + "OyBTZXRzIHRoZSByYW5kb20gc2VlZCB0byB1bnNpZ25lZCAyNTYtYml0IHNlZWQuCigpIHNldF9zZWVkKGludCB4KSBpbXB1cmUgYXNtICJTRVRSQU5EIjsKOzs7IE1p" + + "eGVzIHVuc2lnbmVkIDI1Ni1iaXQgaW50ZWdlciB4IGludG8gdGhlIHJhbmRvbSBzZWVkIHIgYnkgc2V0dGluZyB0aGUgcmFuZG9tIHNlZWQgdG8gc2hhMjU2IG9mIHRo" + + "ZSBjb25jYXRlbmF0aW9uIG9mIHR3byAzMi1ieXRlIHN0cmluZ3M6IHRoZSBmaXJzdCB3aXRoIHRoZSBiaWctZW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvbGQg" + + "c2VlZCByLCBhbmQgdGhlIHNlY29uZCB3aXRoIHRoZSBiaWctZW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIHguCigpIHJhbmRvbWl6ZShpbnQgeCkgaW1wdXJlIGFzbSAi" + + "QUREUkFORCI7Cjs7OyBFcXVpdmFsZW50IHRvIHJhbmRvbWl6ZShjdXJfbHQoKSk7LgooKSByYW5kb21pemVfbHQoKSBpbXB1cmUgYXNtICJMVElNRSIgIkFERFJBTkQi" + + "OwoKOzs7IENoZWNrcyB3aGV0aGVyIHRoZSBkYXRhIHBhcnRzIG9mIHR3byBzbGljZXMgY29pbnNpZGUKaW50IGVxdWFsX3NsaWNlc19iaXRzKHNsaWNlIGEsIHNsaWNl" + + "IGIpIGFzbSAiU0RFUSI7Cjs7OyBDaGVja3Mgd2hldGhlciBiIGlzIGEgbnVsbC4gTm90ZSwgdGhhdCBGdW5DIGFsc28gaGFzIHBvbHltb3JwaGljIG51bGw/IGJ1aWx0" + + "LWluLgppbnQgYnVpbGRlcl9udWxsPyhidWlsZGVyIGIpIGFzbSAiSVNOVUxMIjsKOzs7IENvbmNhdGVuYXRlcyB0d28gYnVpbGRlcnMKYnVpbGRlciBzdG9yZV9idWls" + + "ZGVyKGJ1aWxkZXIgdG8sIGJ1aWxkZXIgZnJvbSkgYXNtICJTVEJSIjsKCjs7IENVU1RPTToKCjs7IFRWTSBVUEdSQURFIDIwMjMtMDcgaHR0cHM6Ly9kb2NzLnRvbi5v" + + "cmcvbGVhcm4vdHZtLWluc3RydWN0aW9ucy90dm0tdXBncmFkZS0yMDIzLTA3Cjs7IEluIG1haW5uZXQgc2luY2UgMjAgRGVjIDIwMjMgaHR0cHM6Ly90Lm1lL3RvbmJs" + + "b2NrY2hhaW4vMjI2Cgo7OzsgUmV0cmlldmVzIGNvZGUgb2Ygc21hcnQtY29udHJhY3QgZnJvbSBjNwpjZWxsIG15X2NvZGUoKSBhc20gIk1ZQ09ERSI7Cg=="; +files["stdlib.tact"] = + "aW1wb3J0ICIuL3N0ZC9wcmltaXRpdmVzIjsKaW1wb3J0ICIuL3N0ZC9jZWxscyI7CmltcG9ydCAiLi9zdGQvY3J5cHRvIjsKaW1wb3J0ICIuL3N0ZC90ZXh0IjsKaW1w" + + "b3J0ICIuL3N0ZC9tYXRoIjsKaW1wb3J0ICIuL3N0ZC9jb250cmFjdCI7CmltcG9ydCAiLi9zdGQvZGVidWciOwppbXBvcnQgIi4vc3RkL2NvbnRleHQiOwppbXBvcnQg" + + "Ii4vc3RkL3Jlc2VydmUiOwppbXBvcnQgIi4vc3RkL3NlbmQiOwppbXBvcnQgIi4vc3RkL2NvbmZpZyI7CmltcG9ydCAiLi9zdGQvYmFzZSI7"; +export default files; diff --git a/src/index.ts b/src/index.ts index 892f35d46..e2f84e9c9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -32,4 +32,4 @@ export { createVirtualFileSystem } from "./020-vfs/createVirtualFileSystem"; export * from "./browser"; export * from "./010-pipeline/logger"; -export * from "./030-error/errors"; \ No newline at end of file +export * from "./030-error/errors"; diff --git a/test/tact.config.json b/test/tact.config.json index d1dfa6e2a..14f5b6794 100644 --- a/test/tact.config.json +++ b/test/tact.config.json @@ -43,9 +43,6 @@ "output": "./exit-codes/contracts/output" }, - - - { "name": "maps1", "path": "./e2e-emulated/contracts/maps1.tact", From dcf9ddec67db53ee642355ad826247d9f4b8f51e Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 21:18:43 +0400 Subject: [PATCH 25/26] prepush --- cspell.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cspell.json b/cspell.json index 4738b5970..60e4d36e9 100644 --- a/cspell.json +++ b/cspell.json @@ -160,6 +160,8 @@ "src/050-grammar/next/grammar.gg", "src/050-grammar/next/grammar.ts", "src/080-generator/writers/writeStdlib.ts", + "src/090-func/funcfiftlib.js", + "src/090-func/funcCompile.ts", "test/e2e-emulated/address.spec.ts", "test/e2e-emulated/intrinsics.spec.ts", "test/e2e-emulated/optionals.spec.ts", From ef1222f038bfac0bb839e802d8ccdfbe0afda9df Mon Sep 17 00:00:00 2001 From: verytactical <186486509+verytactical@users.noreply.github.com> Date: Thu, 9 Jan 2025 22:01:22 +0400 Subject: [PATCH 26/26] ci --- examples/verify.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/verify.ts b/examples/verify.ts index 5fde96295..9ef4a9e6e 100644 --- a/examples/verify.ts +++ b/examples/verify.ts @@ -2,7 +2,7 @@ import normalize from "path-normalize"; import { Cell } from "@ton/core"; import { Config, Options } from "../src/000-config/parseConfig"; import { ILogger, Logger } from "../src/010-pipeline/logger"; -import { PackageFileFormat, run } from "../src/main"; +import { PackageFileFormat, run } from "../src"; import { fileFormat } from "../src/110-packaging/fileFormat"; import { getCompilerVersion } from "../src/010-pipeline/version";